MDEV-24917 Page cleaner wrongly remains idle
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.
This commit is contained in:
parent
9d7dc1f6d0
commit
93522bc9a9
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));
|
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(
|
|||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************//**
|
/****************************************************************//**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user