summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVlad Lesin <vlad_lesin@mail.ru>2020-04-27 21:46:05 +0300
committerVlad Lesin <vlad_lesin@mail.ru>2020-04-27 22:10:50 +0300
commitd0150dc14e11f2e0b7ad60b9db40bd65e82e917e (patch)
treeb153d0b8c140180311887aa62b7eeded075fd20f
parent581df0df89c68fc6c5acb59efe89053b2036844a (diff)
downloadmariadb-git-d0150dc14e11f2e0b7ad60b9db40bd65e82e917e.tar.gz
MDEV-20230: mariabackup --ftwrl-wait-timeout never times out on explicitbb-10.2-MDEV-20230-ftwrl-wait-timeout
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.
-rw-r--r--extra/mariabackup/backup_mysql.cc124
-rw-r--r--mysql-test/suite/mariabackup/backup_lock_wait_timeout.result11
-rw-r--r--mysql-test/suite/mariabackup/backup_lock_wait_timeout.test28
3 files changed, 108 insertions, 55 deletions
diff --git a/extra/mariabackup/backup_mysql.cc b/extra/mariabackup/backup_mysql.cc
index d5d0c90376e..171c4407ed5 100644
--- a/extra/mariabackup/backup_mysql.cc
+++ b/extra/mariabackup/backup_mysql.cc
@@ -959,79 +959,93 @@ 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) {
- /* 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);
- }
+ if (have_lock_wait_timeout || opt_lock_wait_timeout)
+ {
+ char buf[FN_REFLEN];
+ /* Set the maximum supported session value for
+ 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) {
- msg("Executing LOCK TABLES FOR BACKUP...");
- xb_mysql_query(connection, "LOCK TABLES FOR BACKUP", false);
- return(true);
- }
+ if (have_backup_locks)
+ {
+ msg("Executing LOCK TABLES FOR BACKUP...");
+ xb_mysql_query(connection, "LOCK TABLES FOR BACKUP", false);
+ return (true);
+ }
- if (opt_lock_ddl_per_table) {
- start_mdl_waiters_killer();
- }
+ 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
- when the long update is done the FLUSH TABLES WITH READ LOCK
- will start and succeed quickly. So, FLUSH TABLES is to lower
- the probability of a stage where both mysqldump and most client
- connections are stalled. Of course, if a second long update
- starts between the two FLUSHes, we have that bad stall.
+ /* 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
+ when the long update is done the FLUSH TABLES WITH READ LOCK
+ will start and succeed quickly. So, FLUSH TABLES is to lower
+ the probability of a stage where both mysqldump and most client
+ connections are stalled. Of course, if a second long update
+ starts between the two FLUSHes, we have that bad stall.
- Option lock_wait_timeout serve the same purpose and is not
- compatible with this trick.
- */
+ Option lock_wait_timeout serve the same purpose and is not
+ compatible with this trick.
+ */
- msg("Executing FLUSH NO_WRITE_TO_BINLOG TABLES...");
+ 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 (!wait_for_no_updates(connection, opt_lock_wait_timeout,
- opt_lock_wait_threshold)) {
- return(false);
- }
- }
+ if (opt_lock_wait_timeout)
+ {
+ if (!wait_for_no_updates(connection, opt_lock_wait_timeout,
+ opt_lock_wait_threshold))
+ {
+ return (false);
+ }
+ }
- msg("Executing FLUSH TABLES WITH READ LOCK...");
+ msg("Executing FLUSH TABLES WITH READ LOCK...");
- if (opt_kill_long_queries_timeout) {
- start_query_killer();
- }
+ 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) {
- stop_mdl_waiters_killer();
- }
+ if (opt_lock_ddl_per_table)
+ {
+ stop_mdl_waiters_killer();
+ }
- if (opt_kill_long_queries_timeout) {
- stop_query_killer();
- }
+ 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.
diff --git a/mysql-test/suite/mariabackup/backup_lock_wait_timeout.result b/mysql-test/suite/mariabackup/backup_lock_wait_timeout.result
new file mode 100644
index 00000000000..9806bc29b47
--- /dev/null
+++ b/mysql-test/suite/mariabackup/backup_lock_wait_timeout.result
@@ -0,0 +1,11 @@
+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;
diff --git a/mysql-test/suite/mariabackup/backup_lock_wait_timeout.test b/mysql-test/suite/mariabackup/backup_lock_wait_timeout.test
new file mode 100644
index 00000000000..e0f43910ef6
--- /dev/null
+++ b/mysql-test/suite/mariabackup/backup_lock_wait_timeout.test
@@ -0,0 +1,28 @@
+--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