summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Vojtovich <svoj@mariadb.org>2019-11-01 19:18:47 +0400
committerSergey Vojtovich <svoj@mariadb.org>2020-02-13 01:27:14 +0400
commitc5e00fea102f0f8d614f60f39737b55dd09b4062 (patch)
tree51ec14aaffb7f0a31b279edb19d8f06b2e81508d
parent646d1ec83a57d9a5b380079afc3612c1d9acadd5 (diff)
downloadmariadb-git-c5e00fea102f0f8d614f60f39737b55dd09b4062.tar.gz
MDEV-20867 - Perform careful review of "Server crashes with BACKUP STAGE and FLUSH TABLE table_name"
Reverted original patch (c2e0a0b). For consistency with "LOCK TABLE <table_name> READ" and "FLUSH TABLES WITH READ LOCK", which are forbidden under "BACKUP STAGE", forbid "FLUSH TABLE <table_name> FOR EXPORT" and "FLUSH TABLE <table_name> WITH READ LOCK" as well. It'd allow consistent fixes for problems like MDEV-18643.
-rw-r--r--mysql-test/main/backup_interaction.result24
-rw-r--r--mysql-test/main/backup_interaction.test27
-rw-r--r--sql/mdl.cc11
-rw-r--r--sql/sql_class.cc1
-rw-r--r--sql/sql_reload.cc6
5 files changed, 16 insertions, 53 deletions
diff --git a/mysql-test/main/backup_interaction.result b/mysql-test/main/backup_interaction.result
index f1354f6778e..3c3071b8e70 100644
--- a/mysql-test/main/backup_interaction.result
+++ b/mysql-test/main/backup_interaction.result
@@ -521,26 +521,8 @@ BACKUP STAGE END;
CREATE OR REPLACE TABLE t1 (pk INT PRIMARY KEY, f INT);
BACKUP STAGE START;
FLUSH TABLE t1 FOR EXPORT;
-UNLOCK TABLES;
-BACKUP STAGE END;
-DROP TABLE t1;
-CREATE TABLE t1 (a INT);
-BACKUP STAGE START;
-FLUSH TABLE t1 FOR EXPORT;
-UNLOCK TABLES;
-connect con1,localhost,root,,test;
-BACKUP STAGE START;
-connection default;
-BACKUP STAGE END;
-connection con1;
-BACKUP STAGE END;
-disconnect con1;
-connection default;
-DROP TABLE t1;
-CREATE TABLE t1 (a INT);
-BACKUP STAGE START;
-FLUSH TABLES t1 WITH READ LOCK;
-UNLOCK TABLES;
-BACKUP STAGE BLOCK_COMMIT;
+ERROR HY000: Can't execute the command as you have a BACKUP STAGE active
+FLUSH TABLE t1 WITH READ LOCK;
+ERROR HY000: Can't execute the command as you have a BACKUP STAGE active
BACKUP STAGE END;
DROP TABLE t1;
diff --git a/mysql-test/main/backup_interaction.test b/mysql-test/main/backup_interaction.test
index 8ac905cc6ff..09ed769c898 100644
--- a/mysql-test/main/backup_interaction.test
+++ b/mysql-test/main/backup_interaction.test
@@ -509,30 +509,9 @@ BACKUP STAGE END;
CREATE OR REPLACE TABLE t1 (pk INT PRIMARY KEY, f INT);
BACKUP STAGE START;
+--error ER_BACKUP_LOCK_IS_ACTIVE
FLUSH TABLE t1 FOR EXPORT;
-UNLOCK TABLES;
-BACKUP STAGE END;
-DROP TABLE t1;
-
-CREATE TABLE t1 (a INT);
-BACKUP STAGE START;
-FLUSH TABLE t1 FOR EXPORT;
-UNLOCK TABLES;
---connect (con1,localhost,root,,test)
---send BACKUP STAGE START
---connection default
-BACKUP STAGE END;
---connection con1
-reap;
-BACKUP STAGE END;
---disconnect con1
---connection default
-DROP TABLE t1;
-
-CREATE TABLE t1 (a INT);
-BACKUP STAGE START;
-FLUSH TABLES t1 WITH READ LOCK;
-UNLOCK TABLES;
-BACKUP STAGE BLOCK_COMMIT;
+--error ER_BACKUP_LOCK_IS_ACTIVE
+FLUSH TABLE t1 WITH READ LOCK;
BACKUP STAGE END;
DROP TABLE t1;
diff --git a/sql/mdl.cc b/sql/mdl.cc
index e7c0d699d76..591127dc1d8 100644
--- a/sql/mdl.cc
+++ b/sql/mdl.cc
@@ -3166,19 +3166,14 @@ void MDL_context::set_transaction_duration_for_all_locks()
DBUG_ASSERT(m_tickets[MDL_STATEMENT].is_empty());
- /* Don't swap locks if this thread is running backup stages */
- if (current_thd->current_backup_stage == BACKUP_FINISHED)
- m_tickets[MDL_TRANSACTION].swap(m_tickets[MDL_EXPLICIT]);
+ m_tickets[MDL_TRANSACTION].swap(m_tickets[MDL_EXPLICIT]);
Ticket_iterator it_ticket(m_tickets[MDL_EXPLICIT]);
while ((ticket= it_ticket++))
{
- if (ticket->get_key()->mdl_namespace() != MDL_key::BACKUP)
- {
- m_tickets[MDL_EXPLICIT].remove(ticket);
- m_tickets[MDL_TRANSACTION].push_front(ticket);
- }
+ m_tickets[MDL_EXPLICIT].remove(ticket);
+ m_tickets[MDL_TRANSACTION].push_front(ticket);
}
#ifndef DBUG_OFF
diff --git a/sql/sql_class.cc b/sql/sql_class.cc
index d8d4b9a8d64..84e18e71a80 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -5580,6 +5580,7 @@ void THD::leave_locked_tables_mode()
{
if (locked_tables_mode == LTM_LOCK_TABLES)
{
+ DBUG_ASSERT(current_backup_stage == BACKUP_FINISHED);
/*
When leaving LOCK TABLES mode we have to change the duration of most
of the metadata locks being held, except for HANDLER and GRL locks,
diff --git a/sql/sql_reload.cc b/sql/sql_reload.cc
index 0e166b169aa..0898bea6d41 100644
--- a/sql/sql_reload.cc
+++ b/sql/sql_reload.cc
@@ -525,6 +525,12 @@ bool flush_tables_with_read_lock(THD *thd, TABLE_LIST *all_tables)
goto error;
}
+ if (thd->current_backup_stage != BACKUP_FINISHED)
+ {
+ my_error(ER_BACKUP_LOCK_IS_ACTIVE, MYF(0));
+ return true;
+ }
+
if (thd->lex->type & REFRESH_READ_LOCK)
{
/*