diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2021-06-23 08:05:27 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2021-06-23 08:05:27 +0300 |
commit | 09b03ff31b8fd71aee265c22479613a28879f3b9 (patch) | |
tree | bf7f562922638693a48b566fe295c702364b55ea /storage/innobase/trx/trx0rseg.cc | |
parent | bf2680ea09a81864e049eadee1381b4f04ee92f4 (diff) | |
parent | 1deb630484caf572c9cdf1b3c2d5bdd4eedc51d0 (diff) | |
download | mariadb-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.cc | 25 |
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, |