diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2021-02-18 18:20:50 +0200 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2021-02-18 18:20:50 +0200 |
commit | 93522bc9a987e756ae1872953af1ddc1731ce9b6 (patch) | |
tree | fb5415a37d3e9138e6d11b06282cab2f648d69e3 | |
parent | 9d7dc1f6d0494d8c408f2c3e51a214e364783346 (diff) | |
download | mariadb-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.result | 14 | ||||
-rw-r--r-- | mysql-test/suite/innodb/t/page_cleaner.test | 30 | ||||
-rw-r--r-- | storage/innobase/buf/buf0flu.cc | 8 | ||||
-rw-r--r-- | storage/innobase/handler/ha_innodb.cc | 2 |
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); } /****************************************************************//** |