summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2021-09-24 12:11:52 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2021-09-24 12:11:52 +0300
commitd5bd704f4be776df00e3f2e629936bb60d6b10a1 (patch)
tree8d5da247cb9776eebbbdf9f3f8da26ba52c722c8
parent9c2d9236e1b3d012e26bd1d76ce06c681927cd03 (diff)
parent4bfdba2e89ce825a9f89b2e6ed7eca3e0ce2c128 (diff)
downloadmariadb-git-d5bd704f4be776df00e3f2e629936bb60d6b10a1.tar.gz
Merge 10.3 into 10.4
-rw-r--r--mysql-test/suite/innodb/r/undo_truncate.result13
-rw-r--r--mysql-test/suite/innodb/t/undo_truncate.test36
-rw-r--r--storage/innobase/include/trx0rseg.h2
-rw-r--r--storage/innobase/srv/srv0srv.cc2
-rw-r--r--storage/innobase/trx/trx0purge.cc3
-rw-r--r--storage/innobase/trx/trx0rseg.cc13
-rw-r--r--storage/innobase/trx/trx0sys.cc2
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);