diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2021-09-24 12:14:35 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2021-09-24 12:14:35 +0300 |
commit | 88f38661b75e68ed255491ed51e52e73cfe06011 (patch) | |
tree | b4ceb1f2eddb28c89a70251b77c328e944077b2e | |
parent | 7e2b42324caf6faaaa5a3a033c2b24e1fee93669 (diff) | |
parent | d5bd704f4be776df00e3f2e629936bb60d6b10a1 (diff) | |
download | mariadb-git-88f38661b75e68ed255491ed51e52e73cfe06011.tar.gz |
Merge 10.4 into 10.5
-rw-r--r-- | mysql-test/suite/innodb/r/undo_truncate.result | 10 | ||||
-rw-r--r-- | mysql-test/suite/innodb/t/undo_truncate.test | 26 | ||||
-rw-r--r-- | storage/innobase/include/trx0rseg.h | 2 | ||||
-rw-r--r-- | storage/innobase/srv/srv0srv.cc | 4 | ||||
-rw-r--r-- | storage/innobase/trx/trx0purge.cc | 4 | ||||
-rw-r--r-- | storage/innobase/trx/trx0rseg.cc | 12 | ||||
-rw-r--r-- | storage/innobase/trx/trx0sys.cc | 2 | ||||
m--------- | wsrep-lib | 0 |
8 files changed, 37 insertions, 23 deletions
diff --git a/mysql-test/suite/innodb/r/undo_truncate.result b/mysql-test/suite/innodb/r/undo_truncate.result index 54eeee9a9df..fbfd061c9cc 100644 --- a/mysql-test/suite/innodb/r/undo_truncate.result +++ b/mysql-test/suite/innodb/r/undo_truncate.result @@ -1,10 +1,5 @@ -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_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,,; @@ -33,7 +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_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 8de93814ed8..9601de482b3 100644 --- a/mysql-test/suite/innodb/t/undo_truncate.test +++ b/mysql-test/suite/innodb/t/undo_truncate.test @@ -1,21 +1,16 @@ --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 --disable_query_log call mtr.add_suppression("InnoDB: Difficult to find free blocks in the buffer pool"); --enable_query_log -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_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. @@ -46,9 +41,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)`; + +drop table t1, t2; -SET GLOBAL innodb_purge_rseg_truncate_frequency = @save_frequency; -SET GLOBAL innodb_undo_log_truncate = @save_truncate; +if ($trx_before != $trx_after) +{ + echo Transaction sequence mismatch: $trx_before != $trx_after; +} diff --git a/storage/innobase/include/trx0rseg.h b/storage/innobase/include/trx0rseg.h index 7e4511b8f30..2f78841e90d 100644 --- a/storage/innobase/include/trx0rseg.h +++ b/storage/innobase/include/trx0rseg.h @@ -54,6 +54,7 @@ trx_rsegf_get_new( /** 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 @@ -62,6 +63,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 685e4f19aa2..73e67c12d58 100644 --- a/storage/innobase/srv/srv0srv.cc +++ b/storage/innobase/srv/srv0srv.cc @@ -1948,7 +1948,9 @@ static uint32_t srv_do_purge(ulint* n_total_purged) n_pages_purged = trx_purge( n_use_threads, !(++count % srv_purge_rseg_truncate_frequency) - || purge_sys.truncate.current); + || purge_sys.truncate.current + || (srv_shutdown_state != SRV_SHUTDOWN_NONE + && srv_fast_shutdown == 0)); *n_total_purged += n_pages_purged; } while (n_pages_purged > 0 && !purge_sys.paused() diff --git a/storage/innobase/trx/trx0purge.cc b/storage/innobase/trx/trx0purge.cc index 3e03f3b5244..4542e391dca 100644 --- a/storage/innobase/trx/trx0purge.cc +++ b/storage/innobase/trx/trx0purge.cc @@ -749,7 +749,9 @@ not_free: ut_ad(rseg->is_persistent()); ut_d(const auto old_page= rseg->page_no); - buf_block_t *rblock= trx_rseg_header_create(&space, i, sys_header, &mtr); + buf_block_t *rblock= trx_rseg_header_create(&space, i, + trx_sys.get_max_trx_id(), + sys_header, &mtr); ut_ad(rblock); rseg->page_no= rblock ? rblock->page.id().page_no() : FIL_NULL; ut_ad(old_page == rseg->page_no); diff --git a/storage/innobase/trx/trx0rseg.cc b/storage/innobase/trx/trx0rseg.cc index 307f87578dd..34e1ccfc277 100644 --- a/storage/innobase/trx/trx0rseg.cc +++ b/storage/innobase/trx/trx0rseg.cc @@ -299,6 +299,7 @@ void trx_rseg_format_upgrade(buf_block_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 @@ -307,6 +308,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) { @@ -329,10 +331,16 @@ 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 */ flst_init(block, TRX_RSEG_HISTORY + TRX_RSEG, mtr); + mtr->write<8,mtr_t::MAYBE_NOP>(*block, + TRX_RSEG + TRX_RSEG_MAX_TRX_ID + + block->frame, max_trx_id); + /* Reset the undo log slots */ mtr->memset(block, TRX_RSEG_UNDO_SLOTS + TRX_RSEG, TRX_RSEG_N_SLOTS * 4, 0xff); @@ -694,7 +702,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); @@ -725,7 +733,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 3064645f556..bcde969eb41 100644 --- a/storage/innobase/trx/trx0sys.cc +++ b/storage/innobase/trx/trx0sys.cc @@ -192,7 +192,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_id_t(0, FSP_FIRST_RSEG_PAGE_NO)); diff --git a/wsrep-lib b/wsrep-lib -Subproject 4f1c201c9d8ba96f9f43e9aafe8bb6a6c8aeceb +Subproject efb4aab090cb9c1b57b9e7f9988ae1c41f48344 |