Commit 42e1815a authored by Marko Mäkelä's avatar Marko Mäkelä

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
parent 8761571a
# 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;
...@@ -1686,6 +1686,18 @@ NUMERIC_BLOCK_SIZE 0 ...@@ -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
......
...@@ -271,6 +271,27 @@ enum default_row_format_enum { ...@@ -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, ...@@ -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[]= { ...@@ -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),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment