MDEV-16952 Introduce SET GLOBAL innodb_max_purge_lag_wait

Let us introduce a dummy variable innodb_max_purge_lag_wait
for waiting that the InnoDB history list length is below
the user-specified limit. Specifically,

SET GLOBAL innodb_max_purge_lag_wait=0;

should wait for all history to be purged. This could be useful
when upgrading from an older version to MariaDB 10.3 or later,
to avoid hitting MDEV-15912.

Note: the history cannot be purged if there exist transactions
that may see old versions.

Reviewed by: Vladislav Vaintroub
This commit is contained in:
Marko Mäkelä 2020-10-27 15:35:04 +02:00
commit 42e1815ad8
3 changed files with 47 additions and 16 deletions

View file

@ -1,25 +1,17 @@
# Wait for everything to be purged.
# The user should have set innodb_purge_rseg_truncate_frequency=1.
--disable_query_log
if (!$wait_all_purged)
{
let $wait_all_purged= 0;
SET GLOBAL innodb_max_purge_lag_wait= 0;
}
let $remaining_expect= `select concat('InnoDB ',$wait_all_purged)`;
let $wait_counter= 600;
while ($wait_counter)
if ($wait_all_purged)
{
--replace_regex /.*History list length ([0-9]+).*/\1/
let $remaining= `SHOW ENGINE INNODB STATUS`;
if ($remaining == $remaining_expect)
{
let $wait_counter= 0;
}
if ($wait_counter)
{
real_sleep 0.1;
dec $wait_counter;
}
eval SET GLOBAL innodb_max_purge_lag_wait= $wait_all_purged;
}
--enable_query_log
--replace_regex /.*History list length ([0-9]+).*/\1/
let $remaining= `SHOW ENGINE INNODB STATUS`;
echo $remaining transactions not purged;

View file

@ -1686,6 +1686,18 @@ NUMERIC_BLOCK_SIZE 0
ENUM_VALUE_LIST NULL
READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME INNODB_MAX_PURGE_LAG_WAIT
SESSION_VALUE NULL
DEFAULT_VALUE 4294967295
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE INT UNSIGNED
VARIABLE_COMMENT Wait until History list length is below the specified limit
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 4294967295
NUMERIC_BLOCK_SIZE 0
ENUM_VALUE_LIST NULL
READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME INNODB_MAX_UNDO_LOG_SIZE
SESSION_VALUE NULL
DEFAULT_VALUE 10485760