diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2021-09-24 12:11:52 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2021-09-24 12:11:52 +0300 |
commit | d5bd704f4be776df00e3f2e629936bb60d6b10a1 (patch) | |
tree | 8d5da247cb9776eebbbdf9f3f8da26ba52c722c8 | |
parent | 9c2d9236e1b3d012e26bd1d76ce06c681927cd03 (diff) | |
parent | 4bfdba2e89ce825a9f89b2e6ed7eca3e0ce2c128 (diff) | |
download | mariadb-git-d5bd704f4be776df00e3f2e629936bb60d6b10a1.tar.gz |
Merge 10.3 into 10.4
-rw-r--r-- | mysql-test/suite/innodb/r/undo_truncate.result | 13 | ||||
-rw-r--r-- | mysql-test/suite/innodb/t/undo_truncate.test | 36 | ||||
-rw-r--r-- | storage/innobase/include/trx0rseg.h | 2 | ||||
-rw-r--r-- | storage/innobase/srv/srv0srv.cc | 2 | ||||
-rw-r--r-- | storage/innobase/trx/trx0purge.cc | 3 | ||||
-rw-r--r-- | storage/innobase/trx/trx0rseg.cc | 13 | ||||
-rw-r--r-- | storage/innobase/trx/trx0sys.cc | 2 |
7 files changed, 34 insertions, 37 deletions
diff --git a/mysql-test/suite/innodb/r/undo_truncate.result b/mysql-test/suite/innodb/r/undo_truncate.result index 25fd07cf930..fbfd061c9cc 100644 --- a/mysql-test/suite/innodb/r/undo_truncate.result +++ b/mysql-test/suite/innodb/r/undo_truncate.result @@ -1,12 +1,5 @@ -SET @save_undo_logs = @@GLOBAL.innodb_undo_logs; -SET @save_frequency = @@GLOBAL.innodb_purge_rseg_truncate_frequency; -SET @save_truncate = @@GLOBAL.innodb_undo_log_truncate; SET GLOBAL innodb_undo_log_truncate = 0; -SET GLOBAL innodb_undo_logs = 4; SET GLOBAL innodb_purge_rseg_truncate_frequency = 1; -SET @trunc_start= -(SELECT variable_value FROM information_schema.global_status -WHERE variable_name = 'innodb_undo_truncations'); create table t1(keyc int primary key, c char(100)) engine = innodb; create table t2(keyc int primary key, c char(100)) engine = innodb; connect con1,localhost,root,,; @@ -35,8 +28,6 @@ connection con2; commit; disconnect con2; connection default; +set global innodb_fast_shutdown=0; +# restart drop table t1, t2; -InnoDB 0 transactions not purged -SET GLOBAL innodb_undo_logs = @save_undo_logs; -SET GLOBAL innodb_purge_rseg_truncate_frequency = @save_frequency; -SET GLOBAL innodb_undo_log_truncate = @save_truncate; diff --git a/mysql-test/suite/innodb/t/undo_truncate.test b/mysql-test/suite/innodb/t/undo_truncate.test index 376b3587dd8..ae6ff93cce1 100644 --- a/mysql-test/suite/innodb/t/undo_truncate.test +++ b/mysql-test/suite/innodb/t/undo_truncate.test @@ -1,19 +1,12 @@ --source include/have_innodb.inc --source include/innodb_page_size.inc --source include/have_undo_tablespaces.inc +--source include/not_embedded.inc --source include/have_sequence.inc -SET @save_undo_logs = @@GLOBAL.innodb_undo_logs; -SET @save_frequency = @@GLOBAL.innodb_purge_rseg_truncate_frequency; -SET @save_truncate = @@GLOBAL.innodb_undo_log_truncate; SET GLOBAL innodb_undo_log_truncate = 0; -SET GLOBAL innodb_undo_logs = 4; SET GLOBAL innodb_purge_rseg_truncate_frequency = 1; -SET @trunc_start= -(SELECT variable_value FROM information_schema.global_status -WHERE variable_name = 'innodb_undo_truncations'); - #----------------------------------------------------------------------------- # # Perform DML action using multiple clients and multiple undo tablespace. @@ -44,21 +37,20 @@ commit; disconnect con1; connection con2; commit; disconnect con2; connection default; -drop table t1, t2; ---source include/wait_all_purged.inc +--replace_regex /.*Trx id counter ([0-9]+).*/\1/ +let $trx_before= `SHOW ENGINE INNODB STATUS`; +let $trx_before= `select substr('$trx_before',9)+2`; + +set global innodb_fast_shutdown=0; +--source include/restart_mysqld.inc +--replace_regex /.*Trx id counter ([0-9]+).*/\1/ +let $trx_after= `SHOW ENGINE INNODB STATUS`; +let $trx_after= `select substr('$trx_after',9)`; -# Truncation will normally not occur with innodb_page_size=64k, -# and occasionally not with innodb_page_size=32k, -# because the undo log will not grow enough. -if (`select @@innodb_page_size IN (4096,8192,16384)`) +drop table t1, t2; + +if ($trx_before != $trx_after) { - let $wait_condition = (SELECT variable_value!=@trunc_start - FROM information_schema.global_status - WHERE variable_name = 'innodb_undo_truncations'); - source include/wait_condition.inc; + echo Transaction sequence mismatch: $trx_before != $trx_after; } - -SET GLOBAL innodb_undo_logs = @save_undo_logs; -SET GLOBAL innodb_purge_rseg_truncate_frequency = @save_frequency; -SET GLOBAL innodb_undo_log_truncate = @save_truncate; diff --git a/storage/innobase/include/trx0rseg.h b/storage/innobase/include/trx0rseg.h index 687c6fa0e97..27548e96b0a 100644 --- a/storage/innobase/include/trx0rseg.h +++ b/storage/innobase/include/trx0rseg.h @@ -71,6 +71,7 @@ trx_rsegf_undo_find_free(const trx_rsegf_t* rsegf); /** Create a rollback segment header. @param[in,out] space system, undo, or temporary tablespace @param[in] rseg_id rollback segment identifier +@param[in] max_trx_id new value of TRX_RSEG_MAX_TRX_ID @param[in,out] sys_header the TRX_SYS page (NULL for temporary rseg) @param[in,out] mtr mini-transaction @return the created rollback segment @@ -79,6 +80,7 @@ buf_block_t* trx_rseg_header_create( fil_space_t* space, ulint rseg_id, + trx_id_t max_trx_id, buf_block_t* sys_header, mtr_t* mtr); diff --git a/storage/innobase/srv/srv0srv.cc b/storage/innobase/srv/srv0srv.cc index 13a741c6ec5..8934a393a1d 100644 --- a/storage/innobase/srv/srv0srv.cc +++ b/storage/innobase/srv/srv0srv.cc @@ -2614,6 +2614,8 @@ static uint32_t srv_do_purge(ulint* n_total_purged n_use_threads, !(++count % srv_purge_rseg_truncate_frequency) || purge_sys.truncate.current + || (srv_shutdown_state != SRV_SHUTDOWN_NONE + && srv_fast_shutdown == 0) #ifdef UNIV_DEBUG , slot #endif diff --git a/storage/innobase/trx/trx0purge.cc b/storage/innobase/trx/trx0purge.cc index 8a74dbfa2bf..3f2f3626bf2 100644 --- a/storage/innobase/trx/trx0purge.cc +++ b/storage/innobase/trx/trx0purge.cc @@ -715,7 +715,8 @@ not_free: buf_block_t* rblock = trx_rseg_header_create( purge_sys.truncate.current, - rseg->id, sys_header, &mtr); + rseg->id, trx_sys.get_max_trx_id(), + sys_header, &mtr); ut_ad(rblock); rseg->page_no = rblock ? rblock->page.id.page_no() : FIL_NULL; diff --git a/storage/innobase/trx/trx0rseg.cc b/storage/innobase/trx/trx0rseg.cc index 7413e1d243d..49b93541620 100644 --- a/storage/innobase/trx/trx0rseg.cc +++ b/storage/innobase/trx/trx0rseg.cc @@ -295,6 +295,7 @@ void trx_rseg_format_upgrade(trx_rsegf_t* rseg_header, mtr_t* mtr) /** Create a rollback segment header. @param[in,out] space system, undo, or temporary tablespace @param[in] rseg_id rollback segment identifier +@param[in] max_trx_id new value of TRX_RSEG_MAX_TRX_ID @param[in,out] sys_header the TRX_SYS page (NULL for temporary rseg) @param[in,out] mtr mini-transaction @return the created rollback segment @@ -303,6 +304,7 @@ buf_block_t* trx_rseg_header_create( fil_space_t* space, ulint rseg_id, + trx_id_t max_trx_id, buf_block_t* sys_header, mtr_t* mtr) { @@ -325,8 +327,15 @@ trx_rseg_header_create( + block->frame)); ut_ad(0 == mach_read_from_4(TRX_RSEG_HISTORY_SIZE + TRX_RSEG + block->frame)); + ut_ad(0 == mach_read_from_4(TRX_RSEG_MAX_TRX_ID + TRX_RSEG + + block->frame)); /* Initialize the history list */ + if (max_trx_id) { + mlog_write_ull(TRX_RSEG + TRX_RSEG_MAX_TRX_ID + block->frame, + max_trx_id, mtr); + } + flst_init(block, TRX_RSEG_HISTORY + TRX_RSEG, mtr); /* Reset the undo log slots */ @@ -685,7 +694,7 @@ trx_rseg_create(ulint space_id) ulint rseg_id = trx_sys_rseg_find_free(sys_header); if (buf_block_t* rblock = rseg_id == ULINT_UNDEFINED ? NULL - : trx_rseg_header_create(space, rseg_id, sys_header, + : trx_rseg_header_create(space, rseg_id, 0, sys_header, &mtr)) { ut_ad(trx_sysf_rseg_get_space(sys_header, rseg_id) == space_id); @@ -715,7 +724,7 @@ trx_temp_rseg_create() mtr_x_lock_space(fil_system.temp_space, &mtr); buf_block_t* rblock = trx_rseg_header_create( - fil_system.temp_space, i, NULL, &mtr); + fil_system.temp_space, i, 0, NULL, &mtr); trx_rseg_t* rseg = trx_rseg_mem_create( i, fil_system.temp_space, rblock->page.id.page_no()); ut_ad(!rseg->is_persistent()); diff --git a/storage/innobase/trx/trx0sys.cc b/storage/innobase/trx/trx0sys.cc index f59c1f96693..22ed8d0c1cb 100644 --- a/storage/innobase/trx/trx0sys.cc +++ b/storage/innobase/trx/trx0sys.cc @@ -196,7 +196,7 @@ trx_sysf_create( /* Create the first rollback segment in the SYSTEM tablespace */ slot_no = trx_sys_rseg_find_free(block); buf_block_t* rblock = trx_rseg_header_create(fil_system.sys_space, - slot_no, block, mtr); + slot_no, 0, block, mtr); ut_a(slot_no == TRX_SYS_SYSTEM_RSEG_ID); ut_a(rblock->page.id.page_no() == FSP_FIRST_RSEG_PAGE_NO); |