summaryrefslogtreecommitdiff
path: root/storage/innobase/srv/srv0start.cc
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2022-06-07 09:20:07 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2022-06-07 09:20:07 +0300
commit5a33a376825556a5187df10f09e709f18eaa7b32 (patch)
tree6bb213d68066670d7f30fa5d3ac588aae67cb04c /storage/innobase/srv/srv0start.cc
parentcd1de25912c0d004311cb6d947860e8242cc1499 (diff)
parent31fc2eb4bccee8ac3cc2fa26f73a491041e5efd4 (diff)
downloadmariadb-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.cc51
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);
}