diff options
-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); } /****************************************************************//** |