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:
@ -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;
|
||||||
|
@ -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 {
|
|||||||
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),
|
||||||
|
Reference in New Issue
Block a user