Commit d0150dc1 authored by Vlad Lesin's avatar Vlad Lesin

MDEV-20230: mariabackup --ftwrl-wait-timeout never times out on explicit

lock

--ftwrl-wait-timeout does not finish mariabackup execution when acquired
backup lock can't be grabbed for the certain amount of time, it just
waits for a long queries finishing before acquiring the lock to avoid
unnecessary locking.

This commit extends --ftwrl-wait-timeout so, that mariabackup execution
is finished if it waits for backup lock during certain amount of time.
parent 581df0df
......@@ -959,28 +959,33 @@ Function acquires either a backup tables lock, if supported
by the server, or a global read lock (FLUSH TABLES WITH READ LOCK)
otherwise.
@returns true if lock acquired */
bool
lock_tables(MYSQL *connection)
bool lock_tables(MYSQL *connection)
{
if (have_lock_wait_timeout) {
if (have_lock_wait_timeout || opt_lock_wait_timeout)
{
char buf[FN_REFLEN];
/* Set the maximum supported session value for
lock_wait_timeout to prevent unnecessary timeouts when the
global value is changed from the default */
xb_mysql_query(connection,
"SET SESSION lock_wait_timeout=31536000", false);
lock_wait_timeout if opt_lock_wait_timeout is not set to prevent
unnecessary timeouts when the global value is changed from the default */
snprintf(buf, sizeof(buf), "SET SESSION lock_wait_timeout=%u",
opt_lock_wait_timeout ? opt_lock_wait_timeout : 31536000);
xb_mysql_query(connection, buf, false);
}
if (have_backup_locks) {
if (have_backup_locks)
{
msg("Executing LOCK TABLES FOR BACKUP...");
xb_mysql_query(connection, "LOCK TABLES FOR BACKUP", false);
return(true);
return (true);
}
if (opt_lock_ddl_per_table) {
if (opt_lock_ddl_per_table)
{
start_mdl_waiters_killer();
}
if (!opt_lock_wait_timeout && !opt_kill_long_queries_timeout) {
if (!opt_lock_wait_timeout && !opt_kill_long_queries_timeout)
{
/* We do first a FLUSH TABLES. If a long update is running, the
FLUSH TABLES will wait but will not stall the whole mysqld, and
......@@ -996,42 +1001,51 @@ lock_tables(MYSQL *connection)
msg("Executing FLUSH NO_WRITE_TO_BINLOG TABLES...");
xb_mysql_query(connection,
"FLUSH NO_WRITE_TO_BINLOG TABLES", false);
xb_mysql_query(connection, "FLUSH NO_WRITE_TO_BINLOG TABLES", false);
}
if (opt_lock_wait_timeout) {
if (opt_lock_wait_timeout)
{
if (!wait_for_no_updates(connection, opt_lock_wait_timeout,
opt_lock_wait_threshold)) {
return(false);
opt_lock_wait_threshold))
{
return (false);
}
}
msg("Executing FLUSH TABLES WITH READ LOCK...");
if (opt_kill_long_queries_timeout) {
if (opt_kill_long_queries_timeout)
{
start_query_killer();
}
if (have_galera_enabled) {
xb_mysql_query(connection,
"SET SESSION wsrep_causal_reads=0", false);
if (have_galera_enabled)
{
xb_mysql_query(connection, "SET SESSION wsrep_causal_reads=0", false);
}
xb_mysql_query(connection, "FLUSH TABLES WITH READ LOCK", false);
xb_mysql_query(connection, "FLUSH TABLES WITH READ LOCK", false, true);
/* Set the maximum supported session value for
lock_wait_timeout to prevent unnecessary timeouts when the
global value is changed from the default */
if (opt_lock_wait_timeout)
xb_mysql_query(connection, "SET SESSION lock_wait_timeout=31536000",
false);
if (opt_lock_ddl_per_table) {
if (opt_lock_ddl_per_table)
{
stop_mdl_waiters_killer();
}
if (opt_kill_long_queries_timeout) {
if (opt_kill_long_queries_timeout)
{
stop_query_killer();
}
return(true);
return (true);
}
/*********************************************************************//**
If backup locks are used, execute LOCK BINLOG FOR BACKUP provided that we are
not in the --no-lock mode and the lock has not been acquired already.
......
CREATE TABLE t(i INT) ENGINE INNODB;
connect con1,localhost,root,,;
BEGIN;
LOCK TABLES t WRITE;
connection default;
# xtrabackup backup
connection con1;
COMMIT;
connection default;
disconnect con1;
DROP TABLE t;
--source include/have_innodb.inc
--source include/count_sessions.inc
CREATE TABLE t(i INT) ENGINE INNODB;
connect (con1,localhost,root,,);
BEGIN;
LOCK TABLES t WRITE;
--connection default
echo # xtrabackup backup;
let $targetdir=$MYSQLTEST_VARDIR/tmp/backup;
--disable_result_log
--error 1
exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --ftwrl-wait-timeout=1 --target-dir=$targetdir;
--enable_result_log
--connection con1
COMMIT;
--connection default
--disconnect con1
DROP TABLE t;
rmdir $targetdir;
--source include/wait_until_count_sessions.inc
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