From 1756b0f37dd8e5ce8c9cdb9fec8299ba64dd5dee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Tue, 18 Mar 2025 10:41:38 +0200 Subject: [PATCH] MDEV-35813: more robust test case Let us integrate the test case with innodb.page_cleaner so that there will be less interference from log writes due to checkpoints. Also, make the test compatible with ./mtr --cursor-protocol. --- mysql-test/suite/innodb/r/log_write.result | 11 -------- mysql-test/suite/innodb/r/page_cleaner.result | 25 ++++++++++++++++- mysql-test/suite/innodb/t/log_write.test | 12 -------- mysql-test/suite/innodb/t/page_cleaner.test | 28 ++++++++++++++++++- 4 files changed, 51 insertions(+), 25 deletions(-) delete mode 100644 mysql-test/suite/innodb/r/log_write.result delete mode 100644 mysql-test/suite/innodb/t/log_write.test diff --git a/mysql-test/suite/innodb/r/log_write.result b/mysql-test/suite/innodb/r/log_write.result deleted file mode 100644 index 5a9739edf98..00000000000 --- a/mysql-test/suite/innodb/r/log_write.result +++ /dev/null @@ -1,11 +0,0 @@ -# MDEV-35813 Unnecessary InnoDB log writes in INSERT…SELECT -CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB STATS_PERSISTENT=0; -SET GLOBAL innodb_max_purge_lag_wait=0; -SELECT variable_value INTO @log_writes FROM information_schema.global_status -WHERE variable_name='innodb_log_writes'; -INSERT INTO t1 SELECT * FROM t1; -SELECT variable_value-@log_writes FROM information_schema.global_status -WHERE variable_name='innodb_log_writes'; -variable_value-@log_writes -0 -DROP TABLE t1; diff --git a/mysql-test/suite/innodb/r/page_cleaner.result b/mysql-test/suite/innodb/r/page_cleaner.result index 97dd012054b..93c986a93c9 100644 --- a/mysql-test/suite/innodb/r/page_cleaner.result +++ b/mysql-test/suite/innodb/r/page_cleaner.result @@ -2,8 +2,31 @@ SET @save_pct= @@GLOBAL.innodb_max_dirty_pages_pct; SET @save_pct_lwm= @@GLOBAL.innodb_max_dirty_pages_pct_lwm; SET GLOBAL innodb_max_dirty_pages_pct_lwm=0.0; SET GLOBAL innodb_max_dirty_pages_pct=0.0; +CREATE TABLE t(a INT PRIMARY KEY) ENGINE=InnoDB STATS_PERSISTENT=0; +connect prevent_purge,localhost,root; +START TRANSACTION WITH CONSISTENT SNAPSHOT; +connection default; +SET GLOBAL innodb_max_purge_lag_wait=0; SET GLOBAL innodb_max_dirty_pages_pct=90.0; -CREATE TABLE t ENGINE=InnoDB SELECT * FROM seq_1_to_10000; +SELECT variable_value INTO @log_writes FROM information_schema.global_status +WHERE variable_name='innodb_log_writes'; +BEGIN; +INSERT INTO t SELECT * FROM seq_1_to_500; +INSERT INTO t SELECT * FROM seq_501_to_1000; +INSERT INTO t SELECT * FROM seq_1001_to_1500; +INSERT INTO t SELECT * FROM seq_1501_to_2000; +INSERT INTO t SELECT * FROM seq_2001_to_2500; +INSERT INTO t SELECT * FROM seq_2501_to_3000; +INSERT INTO t SELECT * FROM seq_3001_to_3500; +INSERT INTO t SELECT * FROM seq_3501_to_4000; +INSERT INTO t SELECT * FROM seq_4001_to_4500; +INSERT INTO t SELECT * FROM seq_4501_to_5000; +ROLLBACK; +SELECT if(variable_value-@log_writes<10,'ok',variable_value-@log_writes) +FROM information_schema.global_status WHERE variable_name='innodb_log_writes'; +if(variable_value-@log_writes<10,'ok',variable_value-@log_writes) +ok +disconnect prevent_purge; SELECT variable_value>0 FROM information_schema.global_status WHERE variable_name = 'INNODB_BUFFER_POOL_PAGES_DIRTY'; variable_value>0 diff --git a/mysql-test/suite/innodb/t/log_write.test b/mysql-test/suite/innodb/t/log_write.test deleted file mode 100644 index 0527f1f8f89..00000000000 --- a/mysql-test/suite/innodb/t/log_write.test +++ /dev/null @@ -1,12 +0,0 @@ ---source include/have_innodb.inc - ---echo # MDEV-35813 Unnecessary InnoDB log writes in INSERT…SELECT - -CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB STATS_PERSISTENT=0; -SET GLOBAL innodb_max_purge_lag_wait=0; -SELECT variable_value INTO @log_writes FROM information_schema.global_status -WHERE variable_name='innodb_log_writes'; -INSERT INTO t1 SELECT * FROM t1; -SELECT variable_value-@log_writes FROM information_schema.global_status -WHERE variable_name='innodb_log_writes'; -DROP TABLE t1; diff --git a/mysql-test/suite/innodb/t/page_cleaner.test b/mysql-test/suite/innodb/t/page_cleaner.test index f597619aa08..8568bc7ae6f 100644 --- a/mysql-test/suite/innodb/t/page_cleaner.test +++ b/mysql-test/suite/innodb/t/page_cleaner.test @@ -7,6 +7,12 @@ SET @save_pct_lwm= @@GLOBAL.innodb_max_dirty_pages_pct_lwm; SET GLOBAL innodb_max_dirty_pages_pct_lwm=0.0; SET GLOBAL innodb_max_dirty_pages_pct=0.0; +CREATE TABLE t(a INT PRIMARY KEY) ENGINE=InnoDB STATS_PERSISTENT=0; +--connect (prevent_purge,localhost,root) +START TRANSACTION WITH CONSISTENT SNAPSHOT; +--connection default +SET GLOBAL innodb_max_purge_lag_wait=0; + let $wait_condition = SELECT variable_value = 0 FROM information_schema.global_status @@ -15,7 +21,27 @@ WHERE variable_name = 'INNODB_BUFFER_POOL_PAGES_DIRTY'; SET GLOBAL innodb_max_dirty_pages_pct=90.0; -CREATE TABLE t ENGINE=InnoDB SELECT * FROM seq_1_to_10000; +--disable_cursor_protocol +SELECT variable_value INTO @log_writes FROM information_schema.global_status +WHERE variable_name='innodb_log_writes'; +--enable_cursor_protocol + +BEGIN; +INSERT INTO t SELECT * FROM seq_1_to_500; +INSERT INTO t SELECT * FROM seq_501_to_1000; +INSERT INTO t SELECT * FROM seq_1001_to_1500; +INSERT INTO t SELECT * FROM seq_1501_to_2000; +INSERT INTO t SELECT * FROM seq_2001_to_2500; +INSERT INTO t SELECT * FROM seq_2501_to_3000; +INSERT INTO t SELECT * FROM seq_3001_to_3500; +INSERT INTO t SELECT * FROM seq_3501_to_4000; +INSERT INTO t SELECT * FROM seq_4001_to_4500; +INSERT INTO t SELECT * FROM seq_4501_to_5000; +ROLLBACK; + +SELECT if(variable_value-@log_writes<10,'ok',variable_value-@log_writes) +FROM information_schema.global_status WHERE variable_name='innodb_log_writes'; +--disconnect prevent_purge SELECT variable_value>0 FROM information_schema.global_status WHERE variable_name = 'INNODB_BUFFER_POOL_PAGES_DIRTY';