diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2022-06-07 09:20:07 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2022-06-07 09:20:07 +0300 |
commit | 5a33a376825556a5187df10f09e709f18eaa7b32 (patch) | |
tree | 6bb213d68066670d7f30fa5d3ac588aae67cb04c /storage/innobase/srv/srv0start.cc | |
parent | cd1de25912c0d004311cb6d947860e8242cc1499 (diff) | |
parent | 31fc2eb4bccee8ac3cc2fa26f73a491041e5efd4 (diff) | |
download | mariadb-git-5a33a376825556a5187df10f09e709f18eaa7b32.tar.gz |
Merge 10.8 into 10.9
Diffstat (limited to 'storage/innobase/srv/srv0start.cc')
-rw-r--r-- | storage/innobase/srv/srv0start.cc | 51 |
1 files changed, 36 insertions, 15 deletions
diff --git a/storage/innobase/srv/srv0start.cc b/storage/innobase/srv/srv0start.cc index 24d84914f6d..f88b6379498 100644 --- a/storage/innobase/srv/srv0start.cc +++ b/storage/innobase/srv/srv0start.cc @@ -647,10 +647,12 @@ dberr_t srv_undo_tablespaces_init(bool create_new_db) mtr_t mtr; for (uint32_t i= 0; i < srv_undo_tablespaces; ++i) { - mtr.start(); - fsp_header_init(fil_space_get(srv_undo_space_id_start + i), - SRV_UNDO_TABLESPACE_SIZE_IN_PAGES, &mtr); - mtr.commit(); + mtr.start(); + dberr_t err= fsp_header_init(fil_space_get(srv_undo_space_id_start + i), + SRV_UNDO_TABLESPACE_SIZE_IN_PAGES, &mtr); + mtr.commit(); + if (err) + return err; } } @@ -694,10 +696,13 @@ srv_open_tmp_tablespace(bool create_new_db) mtr_t mtr; mtr.start(); mtr.set_log_mode(MTR_LOG_NO_REDO); - fsp_header_init(fil_system.temp_space, - srv_tmp_space.get_sum_of_sizes(), - &mtr); + err = fsp_header_init(fil_system.temp_space, + srv_tmp_space.get_sum_of_sizes(), + &mtr); mtr.commit(); + if (err == DB_SUCCESS) { + err = trx_temp_rseg_create(&mtr); + } } else { /* This file was just opened in the code above! */ ib::error() << "The innodb_temporary" @@ -1135,17 +1140,18 @@ dberr_t srv_start(bool create_new_db) ut_ad(fil_system.sys_space->id == 0); compile_time_assert(TRX_SYS_SPACE == 0); compile_time_assert(IBUF_SPACE_ID == 0); - fsp_header_init(fil_system.sys_space, - uint32_t(sum_of_new_sizes), &mtr); + ut_a(fsp_header_init(fil_system.sys_space, + uint32_t(sum_of_new_sizes), &mtr) + == DB_SUCCESS); ulint ibuf_root = btr_create( DICT_CLUSTERED | DICT_IBUF, fil_system.sys_space, - DICT_IBUF_ID_MIN, nullptr, &mtr); + DICT_IBUF_ID_MIN, nullptr, &mtr, &err); mtr_commit(&mtr); if (ibuf_root == FIL_NULL) { - return(srv_init_abort(DB_ERROR)); + return srv_init_abort(err); } ut_ad(ibuf_root == IBUF_TREE_ROOT_PAGE_NO); @@ -1154,8 +1160,7 @@ dberr_t srv_start(bool create_new_db) the first rollback segment before the double write buffer. All the remaining rollback segments will be created later, after the double write buffer has been created. */ - trx_sys_create_sys_pages(); - err = trx_lists_init_at_db_start(); + err = trx_sys_create_sys_pages(&mtr); if (err != DB_SUCCESS) { return(srv_init_abort(err)); @@ -1263,6 +1268,10 @@ dberr_t srv_start(bool create_new_db) buf_block_t* block = buf_page_get( page_id_t(0, 0), 0, RW_SX_LATCH, &mtr); + /* The first page of the system tablespace + should already have been successfully + accessed earlier during startup. */ + ut_a(block); ulint size = mach_read_from_4( FSP_HEADER_OFFSET + FSP_SIZE + block->page.frame); @@ -1424,6 +1433,11 @@ dberr_t srv_start(bool create_new_db) page_id_t(IBUF_SPACE_ID, FSP_IBUF_HEADER_PAGE_NO), 0, RW_X_LATCH, &mtr); + if (UNIV_UNLIKELY(!block)) { + corrupted_old_page: + mtr.commit(); + return srv_init_abort(DB_CORRUPTION); + } fil_block_check_type(*block, FIL_PAGE_TYPE_SYS, &mtr); /* Already MySQL 3.23.53 initialized FSP_IBUF_TREE_ROOT_PAGE_NO to @@ -1431,16 +1445,25 @@ dberr_t srv_start(bool create_new_db) block = buf_page_get( page_id_t(TRX_SYS_SPACE, TRX_SYS_PAGE_NO), 0, RW_X_LATCH, &mtr); + if (UNIV_UNLIKELY(!block)) { + goto corrupted_old_page; + } fil_block_check_type(*block, FIL_PAGE_TYPE_TRX_SYS, &mtr); block = buf_page_get( page_id_t(TRX_SYS_SPACE, FSP_FIRST_RSEG_PAGE_NO), 0, RW_X_LATCH, &mtr); + if (UNIV_UNLIKELY(!block)) { + goto corrupted_old_page; + } fil_block_check_type(*block, FIL_PAGE_TYPE_SYS, &mtr); block = buf_page_get( page_id_t(TRX_SYS_SPACE, FSP_DICT_HDR_PAGE_NO), 0, RW_X_LATCH, &mtr); + if (UNIV_UNLIKELY(!block)) { + goto corrupted_old_page; + } fil_block_check_type(*block, FIL_PAGE_TYPE_SYS, &mtr); mtr.commit(); } @@ -1540,8 +1563,6 @@ skip_monitors: return(srv_init_abort(err)); } - trx_temp_rseg_create(); - if (srv_force_recovery < SRV_FORCE_NO_BACKGROUND) { srv_start_periodic_timer(srv_master_timer, srv_master_callback, 1000); } |