Commit 93522bc9 authored by Marko Mäkelä's avatar Marko Mäkelä

MDEV-24917 Page cleaner wrongly remains idle

commit a9933105 (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.
parent 9d7dc1f6
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;
--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;
...@@ -2136,11 +2136,13 @@ static os_thread_ret_t DECLARE_THREAD(buf_flush_page_cleaner)(void*) ...@@ -2136,11 +2136,13 @@ static os_thread_ret_t DECLARE_THREAD(buf_flush_page_cleaner)(void*)
double(UT_LIST_GET_LEN(buf_pool.LRU) + UT_LIST_GET_LEN(buf_pool.free)); double(UT_LIST_GET_LEN(buf_pool.LRU) + UT_LIST_GET_LEN(buf_pool.free));
if (lsn_limit); 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) else if (dirty_pct < srv_max_buf_pool_modified_pct)
goto unemployed; 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() const lsn_t oldest_lsn= buf_pool.get_oldest_modified()
->oldest_modification(); ->oldest_modification();
......
...@@ -17206,10 +17206,10 @@ innodb_max_dirty_pages_pct_update( ...@@ -17206,10 +17206,10 @@ innodb_max_dirty_pages_pct_update(
in_val); in_val);
srv_max_dirty_pages_pct_lwm = 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; srv_max_buf_pool_modified_pct = in_val;
pthread_cond_signal(&buf_pool.do_flush_list);
} }
/****************************************************************//** /****************************************************************//**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment