diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2021-09-16 20:30:08 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2021-09-16 20:30:08 +0300 |
commit | 9d8e83b676325d9ee267bdee49d30e277851ff57 (patch) | |
tree | 05a0b6364928711729a8e2511b9900a6bdb872ab | |
parent | 03c09837fc26822ba2332d9acc3e652b8d010d4c (diff) | |
download | mariadb-git-9d8e83b676325d9ee267bdee49d30e277851ff57.tar.gz |
MDEV-26356 fixup: Adjust innodb_max_purge_lag_wait
innodb_max_purge_lag_wait_update(): To align with
purge_coordinator_state::refresh(), we must trigger a page flush batch
if the last log checkpoint is too old.
This was caught in a hang of the test innodb_gis.rtree_compress.
-rw-r--r-- | storage/innobase/handler/ha_innodb.cc | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 4887d258d25..e431e0499c4 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -228,6 +228,14 @@ static void innodb_max_purge_lag_wait_update(THD *thd, st_mysql_sys_var *, { if (thd_kill_level(thd)) break; + /* Adjust for purge_coordinator_state::refresh() */ + mysql_mutex_lock(&log_sys.mutex); + const lsn_t last= log_sys.last_checkpoint_lsn, + max_age= log_sys.max_checkpoint_age; + mysql_mutex_unlock(&log_sys.mutex); + const lsn_t lsn= log_sys.get_lsn(); + if ((lsn - last) / 4 >= max_age / 5) + buf_flush_ahead(last + max_age / 5, false); srv_wake_purge_thread_if_not_active(); std::this_thread::sleep_for(std::chrono::milliseconds(100)); } |