mirror of
https://github.com/MariaDB/server.git
synced 2025-03-25 00:18:42 +01:00
MDEV-24917 Page cleaner wrongly remains idle
commit a993310593
(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.
This commit is contained in:
parent
9d7dc1f6d0
commit
93522bc9a9
4 changed files with 50 additions and 4 deletions
mysql-test/suite/innodb
storage/innobase
14
mysql-test/suite/innodb/r/page_cleaner.result
Normal file
14
mysql-test/suite/innodb/r/page_cleaner.result
Normal file
|
@ -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;
|
30
mysql-test/suite/innodb/t/page_cleaner.test
Normal file
30
mysql-test/suite/innodb/t/page_cleaner.test
Normal file
|
@ -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;
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/****************************************************************//**
|
||||
|
|
Loading…
Add table
Reference in a new issue