summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2021-09-16 20:30:08 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2021-09-16 20:30:08 +0300
commit9d8e83b676325d9ee267bdee49d30e277851ff57 (patch)
tree05a0b6364928711729a8e2511b9900a6bdb872ab
parent03c09837fc26822ba2332d9acc3e652b8d010d4c (diff)
downloadmariadb-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.cc8
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));
}