summaryrefslogtreecommitdiff
path: root/storage/innobase/trx/trx0rseg.cc
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2021-06-23 08:05:27 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2021-06-23 08:05:27 +0300
commit09b03ff31b8fd71aee265c22479613a28879f3b9 (patch)
treebf7f562922638693a48b566fe295c702364b55ea /storage/innobase/trx/trx0rseg.cc
parentbf2680ea09a81864e049eadee1381b4f04ee92f4 (diff)
parent1deb630484caf572c9cdf1b3c2d5bdd4eedc51d0 (diff)
downloadmariadb-git-09b03ff31b8fd71aee265c22479613a28879f3b9.tar.gz
Merge 10.3 into 10.4
Diffstat (limited to 'storage/innobase/trx/trx0rseg.cc')
-rw-r--r--storage/innobase/trx/trx0rseg.cc25
1 files changed, 21 insertions, 4 deletions
diff --git a/storage/innobase/trx/trx0rseg.cc b/storage/innobase/trx/trx0rseg.cc
index 769bb03c6c9..7413e1d243d 100644
--- a/storage/innobase/trx/trx0rseg.cc
+++ b/storage/innobase/trx/trx0rseg.cc
@@ -415,7 +415,7 @@ trx_rseg_mem_create(ulint id, fil_space_t* space, ulint page_no)
static dberr_t trx_undo_lists_init(trx_rseg_t *rseg, trx_id_t &max_trx_id,
const trx_rsegf_t *rseg_header)
{
- ut_ad(srv_force_recovery < SRV_FORCE_NO_UNDO_LOG_SCAN);
+ ut_ad(srv_force_recovery < SRV_FORCE_NO_UNDO_LOG_SCAN);
for (ulint i= 0; i < TRX_RSEG_N_SLOTS; i++)
{
@@ -569,6 +569,7 @@ dberr_t trx_rseg_array_init()
bool wsrep_xid_in_rseg_found = false;
#endif
mtr_t mtr;
+ dberr_t err = DB_SUCCESS;
for (ulint rseg_id = 0; rseg_id < TRX_SYS_N_RSEGS; rseg_id++) {
mtr.start();
@@ -598,10 +599,11 @@ dberr_t trx_rseg_array_init()
ut_ad(rseg->id == rseg_id);
ut_ad(!trx_sys.rseg_array[rseg_id]);
trx_sys.rseg_array[rseg_id] = rseg;
- if (dberr_t err = trx_rseg_mem_restore(
- rseg, max_trx_id, &mtr)) {
+ if ((err = trx_rseg_mem_restore(
+ rseg, max_trx_id, &mtr))
+ != DB_SUCCESS) {
mtr.commit();
- return err;
+ break;
}
#ifdef WITH_WSREP
if (!wsrep_sys_xid.is_null() &&
@@ -622,6 +624,21 @@ dberr_t trx_rseg_array_init()
mtr.commit();
}
+ if (err != DB_SUCCESS) {
+ for (ulint rseg_id = 0; rseg_id < TRX_SYS_N_RSEGS; rseg_id++) {
+ if (trx_rseg_t*& rseg = trx_sys.rseg_array[rseg_id]) {
+ while (trx_undo_t* u= UT_LIST_GET_FIRST(
+ rseg->undo_list)) {
+ UT_LIST_REMOVE(rseg->undo_list, u);
+ ut_free(u);
+ }
+ trx_rseg_mem_free(rseg);
+ rseg = NULL;
+ }
+ }
+ return err;
+ }
+
#ifdef WITH_WSREP
if (!wsrep_sys_xid.is_null()) {
/* Upgrade from a version prior to 10.3.5,