1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-29 05:21:33 +03:00

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
parent 8761571a71
commit 42e1815ad8
3 changed files with 47 additions and 16 deletions

View File

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

View File

@ -1686,6 +1686,18 @@ NUMERIC_BLOCK_SIZE 0
ENUM_VALUE_LIST NULL ENUM_VALUE_LIST NULL
READ_ONLY NO READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED 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 VARIABLE_NAME INNODB_MAX_UNDO_LOG_SIZE
SESSION_VALUE NULL SESSION_VALUE NULL
DEFAULT_VALUE 10485760 DEFAULT_VALUE 10485760

View File

@ -271,6 +271,27 @@ enum default_row_format_enum {
DEFAULT_ROW_FORMAT_DYNAMIC = 2, DEFAULT_ROW_FORMAT_DYNAMIC = 2,
}; };
/** A dummy variable */
static uint innodb_max_purge_lag_wait;
/** Wait for trx_sys_t::rseg_history_len to be below a limit. */
static void innodb_max_purge_lag_wait_update(THD *thd, st_mysql_sys_var *,
void *, const void *limit)
{
const uint l= *static_cast<const uint*>(limit);
if (trx_sys->rseg_history_len <= l)
return;
mysql_mutex_unlock(&LOCK_global_system_variables);
while (trx_sys->rseg_history_len > l)
{
if (thd_kill_level(thd))
break;
srv_wake_purge_thread_if_not_active();
os_thread_sleep(100000);
}
mysql_mutex_lock(&LOCK_global_system_variables);
}
static static
void set_my_errno(int err) void set_my_errno(int err)
{ {
@ -20147,6 +20168,11 @@ static MYSQL_SYSVAR_ULONG(max_purge_lag_delay, srv_max_purge_lag_delay,
0L, /* Minimum value */ 0L, /* Minimum value */
10000000UL, 0); /* Maximum value */ 10000000UL, 0); /* Maximum value */
static MYSQL_SYSVAR_UINT(max_purge_lag_wait, innodb_max_purge_lag_wait,
PLUGIN_VAR_RQCMDARG,
"Wait until History list length is below the specified limit",
NULL, innodb_max_purge_lag_wait_update, UINT_MAX, 0, UINT_MAX, 0);
static MYSQL_SYSVAR_BOOL(rollback_on_timeout, innobase_rollback_on_timeout, static MYSQL_SYSVAR_BOOL(rollback_on_timeout, innobase_rollback_on_timeout,
PLUGIN_VAR_OPCMDARG | PLUGIN_VAR_READONLY, PLUGIN_VAR_OPCMDARG | PLUGIN_VAR_READONLY,
"Roll back the complete transaction on lock wait timeout, for 4.x compatibility (disabled by default)", "Roll back the complete transaction on lock wait timeout, for 4.x compatibility (disabled by default)",
@ -21195,6 +21221,7 @@ static struct st_mysql_sys_var* innobase_system_variables[]= {
MYSQL_SYSVAR(flushing_avg_loops), MYSQL_SYSVAR(flushing_avg_loops),
MYSQL_SYSVAR(max_purge_lag), MYSQL_SYSVAR(max_purge_lag),
MYSQL_SYSVAR(max_purge_lag_delay), MYSQL_SYSVAR(max_purge_lag_delay),
MYSQL_SYSVAR(max_purge_lag_wait),
MYSQL_SYSVAR(old_blocks_pct), MYSQL_SYSVAR(old_blocks_pct),
MYSQL_SYSVAR(old_blocks_time), MYSQL_SYSVAR(old_blocks_time),
MYSQL_SYSVAR(open_files), MYSQL_SYSVAR(open_files),