summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2021-02-18 18:20:50 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2021-02-18 18:20:50 +0200
commit93522bc9a987e756ae1872953af1ddc1731ce9b6 (patch)
treefb5415a37d3e9138e6d11b06282cab2f648d69e3
parent9d7dc1f6d0494d8c408f2c3e51a214e364783346 (diff)
downloadmariadb-git-bb-10.5-MDEV-24917.tar.gz
MDEV-24917 Page cleaner wrongly remains idlebb-10.5-MDEV-24917
commit a9933105938d4d809ea33ac3196e681cd581374f (MDEV-24537) introduced the regression that the page cleaner will keep sleeping even if there is work to do. innodb_max_dirty_pages_pct_update(): Always wake up the page cleaner on any SET GLOBAL innodb_max_dirty_pages_pct= assignment. buf_flush_page_cleaner(): If innodb_max_dirty_pages_pct is nonzero, consult only that parameter when determining whether there is work to do. Else, consult innodb_max_dirty_pages.
-rw-r--r--mysql-test/suite/innodb/r/page_cleaner.result14
-rw-r--r--mysql-test/suite/innodb/t/page_cleaner.test30
-rw-r--r--storage/innobase/buf/buf0flu.cc8
-rw-r--r--storage/innobase/handler/ha_innodb.cc2
4 files changed, 50 insertions, 4 deletions
diff --git a/mysql-test/suite/innodb/r/page_cleaner.result b/mysql-test/suite/innodb/r/page_cleaner.result
new file mode 100644
index 00000000000..97dd012054b
--- /dev/null
+++ b/mysql-test/suite/innodb/r/page_cleaner.result
@@ -0,0 +1,14 @@
+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;
+SET GLOBAL innodb_max_dirty_pages_pct=90.0;
+CREATE TABLE t ENGINE=InnoDB SELECT * FROM seq_1_to_10000;
+SELECT variable_value>0 FROM information_schema.global_status
+WHERE variable_name = 'INNODB_BUFFER_POOL_PAGES_DIRTY';
+variable_value>0
+1
+SET GLOBAL innodb_max_dirty_pages_pct=0.0;
+DROP TABLE t;
+SET GLOBAL innodb_max_dirty_pages_pct = @save_pct;
+SET GLOBAL innodb_max_dirty_pages_pct_lwm = @save_pct_lwm;
diff --git a/mysql-test/suite/innodb/t/page_cleaner.test b/mysql-test/suite/innodb/t/page_cleaner.test
new file mode 100644
index 00000000000..f597619aa08
--- /dev/null
+++ b/mysql-test/suite/innodb/t/page_cleaner.test
@@ -0,0 +1,30 @@
+--source include/have_innodb.inc
+--source include/have_sequence.inc
+
+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;
+
+let $wait_condition =
+SELECT variable_value = 0
+FROM information_schema.global_status
+WHERE variable_name = 'INNODB_BUFFER_POOL_PAGES_DIRTY';
+--source include/wait_condition.inc
+
+SET GLOBAL innodb_max_dirty_pages_pct=90.0;
+
+CREATE TABLE t ENGINE=InnoDB SELECT * FROM seq_1_to_10000;
+
+SELECT variable_value>0 FROM information_schema.global_status
+WHERE variable_name = 'INNODB_BUFFER_POOL_PAGES_DIRTY';
+
+SET GLOBAL innodb_max_dirty_pages_pct=0.0;
+
+# Without the MDEV-24917 fix, we would time out here.
+--source include/wait_condition.inc
+DROP TABLE t;
+
+SET GLOBAL innodb_max_dirty_pages_pct = @save_pct;
+SET GLOBAL innodb_max_dirty_pages_pct_lwm = @save_pct_lwm;
diff --git a/storage/innobase/buf/buf0flu.cc b/storage/innobase/buf/buf0flu.cc
index 21a01dbd2fe..0acf9334c2c 100644
--- a/storage/innobase/buf/buf0flu.cc
+++ b/storage/innobase/buf/buf0flu.cc
@@ -2136,11 +2136,13 @@ unemployed:
double(UT_LIST_GET_LEN(buf_pool.LRU) + UT_LIST_GET_LEN(buf_pool.free));
if (lsn_limit);
+ else if (srv_max_dirty_pages_pct_lwm != 0.0)
+ {
+ if (dirty_pct < srv_max_dirty_pages_pct_lwm)
+ goto unemployed;
+ }
else if (dirty_pct < srv_max_buf_pool_modified_pct)
goto unemployed;
- else if (srv_max_dirty_pages_pct_lwm == 0.0 ||
- dirty_pct < srv_max_dirty_pages_pct_lwm)
- goto unemployed;
const lsn_t oldest_lsn= buf_pool.get_oldest_modified()
->oldest_modification();
diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc
index d306311365d..d54987889fd 100644
--- a/storage/innobase/handler/ha_innodb.cc
+++ b/storage/innobase/handler/ha_innodb.cc
@@ -17206,10 +17206,10 @@ innodb_max_dirty_pages_pct_update(
in_val);
srv_max_dirty_pages_pct_lwm = in_val;
- pthread_cond_signal(&buf_pool.do_flush_list);
}
srv_max_buf_pool_modified_pct = in_val;
+ pthread_cond_signal(&buf_pool.do_flush_list);
}
/****************************************************************//**