summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVlad Lesin <vlad_lesin@mail.ru>2021-06-11 18:57:34 +0300
committerVlad Lesin <vlad_lesin@mail.ru>2021-06-11 19:17:18 +0300
commit290ac78e933702307112f07e02ccabe089234d33 (patch)
treea430331aaebe2af6b20c3a735644620b3d903ebf
parent1bd681c8b3c5213ce1f7976940a7dc38b48a0d39 (diff)
downloadmariadb-git-10.6-MDEV-25899.tar.gz
MDEV-25899 intermediate files operations are not protected by backup10.6-MDEV-25899
locks Test case.
-rw-r--r--extra/mariabackup/backup_copy.cc15
-rw-r--r--extra/mariabackup/xtrabackup.cc25
-rw-r--r--extra/mariabackup/xtrabackup.h6
-rw-r--r--mysql-test/suite/mariabackup/innodb_ddl_on_intermediate_table.test19
-rw-r--r--sql/sql_table.cc3
5 files changed, 63 insertions, 5 deletions
diff --git a/extra/mariabackup/backup_copy.cc b/extra/mariabackup/backup_copy.cc
index 7735796e8a4..dbf916d947b 100644
--- a/extra/mariabackup/backup_copy.cc
+++ b/extra/mariabackup/backup_copy.cc
@@ -1421,6 +1421,21 @@ bool backup_start(CorruptedPages &corrupted_pages)
}
history_lock_time = time(NULL);
+ DBUG_EXECUTE_IF("emulate_ddl_on_intermediate_table",
+ dbug_emulate_ddl_on_intermediate_table_thread =
+ dbug_start_query_thread(
+ "SET debug_sync='copy_data_between_tables_after_set_backup_lock "
+ "SIGNAL copy_started';"
+ "SET debug_sync='copy_data_between_tables_before_reset_backup_lock "
+ "SIGNAL before_backup_lock_reset WAIT_FOR backup_lock_reset';"
+ "SET debug_sync='alter_table_after_temp_table_drop "
+ "SIGNAL temp_table_dropped';"
+ "SET SESSION lock_wait_timeout = 1;"
+ "ALTER TABLE test.t1 ADD COLUMN col1_copy INT, ALGORITHM = COPY;",
+ NULL, 0, 0);
+ xb_mysql_query(mysql_connection,
+ "SET debug_sync='now WAIT_FOR copy_started'", false, true);
+ );
if (!lock_tables(mysql_connection)) {
return(false);
diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc
index 04ca6fa11d6..cee9fd81291 100644
--- a/extra/mariabackup/xtrabackup.cc
+++ b/extra/mariabackup/xtrabackup.cc
@@ -669,6 +669,7 @@ static void *dbug_execute_in_new_connection(void *arg)
}
static pthread_t dbug_alter_thread;
+pthread_t dbug_emulate_ddl_on_intermediate_table_thread;
/*
Execute query from a new connection, in own thread.
@@ -681,7 +682,7 @@ Execute query from a new connection, in own thread.
@param expected_errno - if not 0, and query finished with error,
expected mysql_errno()
*/
-static void dbug_start_query_thread(
+pthread_t dbug_start_query_thread(
const char *query,
const char *wait_state,
int expected_err,
@@ -693,12 +694,14 @@ static void dbug_start_query_thread(
par->expect_err = expected_err;
par->expect_errno = expected_errno;
par->con = xb_mysql_connect();
-
- mysql_thread_create(0, &dbug_alter_thread, nullptr,
+ if (mysql_set_server_option(par->con, MYSQL_OPTION_MULTI_STATEMENTS_ON))
+ die("Can't set multistatement option for query: %s", query);
+ pthread_t result_thread;
+ mysql_thread_create(0, &result_thread, nullptr,
dbug_execute_in_new_connection, par);
if (!wait_state)
- return;
+ return result_thread;
char q[256];
snprintf(q, sizeof(q),
@@ -720,7 +723,9 @@ static void dbug_start_query_thread(
end:
msg("query '%s' on connection %lu reached state '%s'", query,
mysql_thread_id(par->con), wait_state);
+ return result_thread;
}
+
#endif
void mdl_lock_all()
@@ -4663,6 +4668,12 @@ fail_before_log_copying_thread_start:
DBUG_EXECUTE_IF("check_mdl_lock_works",
pthread_join(dbug_alter_thread, nullptr););
+ DBUG_EXECUTE_IF("emulate_ddl_on_intermediate_table",
+ pthread_join(
+ dbug_emulate_ddl_on_intermediate_table_thread,
+ nullptr);
+ );
+
if (ok) {
backup_finish();
}
@@ -4738,6 +4749,12 @@ void backup_fix_ddl(CorruptedPages &corrupted_pages)
DBUG_MARIABACKUP_EVENT("backup_fix_ddl", {});
+ DBUG_EXECUTE_IF("emulate_ddl_on_intermediate_table",
+ xb_mysql_query(mysql_connection,
+ "SET debug_sync='now SIGNAL backup_lock_reset "
+ "WAIT_FOR temp_table_dropped'", false, true);
+ );
+
for (space_id_to_name_t::iterator iter = ddl_tracker.tables_in_backup.begin();
iter != ddl_tracker.tables_in_backup.end();
iter++) {
diff --git a/extra/mariabackup/xtrabackup.h b/extra/mariabackup/xtrabackup.h
index 0d1d3eb5a6b..d785e1345b1 100644
--- a/extra/mariabackup/xtrabackup.h
+++ b/extra/mariabackup/xtrabackup.h
@@ -27,6 +27,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA
#include "changed_page_bitmap.h"
#include <set>
+#ifndef DBUG_OFF
+pthread_t dbug_start_query_thread(const char *query, const char *wait_state,
+ int expected_err, int expected_errno);
+extern pthread_t dbug_emulate_ddl_on_intermediate_table_thread;
+#endif /* DBUG_OFF */
+
struct xb_delta_info_t
{
xb_delta_info_t(ulint page_size, ulint zip_size, ulint space_id)
diff --git a/mysql-test/suite/mariabackup/innodb_ddl_on_intermediate_table.test b/mysql-test/suite/mariabackup/innodb_ddl_on_intermediate_table.test
new file mode 100644
index 00000000000..797d1e799af
--- /dev/null
+++ b/mysql-test/suite/mariabackup/innodb_ddl_on_intermediate_table.test
@@ -0,0 +1,19 @@
+--source include/have_debug.inc
+--source include/have_innodb.inc
+--source include/have_debug_sync.inc
+
+--let $targetdir=$MYSQLTEST_VARDIR/tmp/backup
+--mkdir $targetdir
+
+CREATE TABLE IF NOT EXISTS t1 ( col1 INT, col_text TEXT ) ENGINE = InnoDB;
+ALTER TABLE t1 ADD FULLTEXT KEY `ftidx1` ( col_text );
+
+echo # xtrabackup backup;
+--let _RR_TRACE_DIR=/dev/shm/mbackup.rr
+--disable_result_log
+exec rr record $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir --dbug=+d,mariabackup_events,emulate_ddl_on_intermediate_table;
+--enable_result_log
+
+SET debug_sync='RESET';
+rmdir $targetdir;
+DROP TABLE t1;
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index e637d680973..536b3520a65 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -10887,7 +10887,7 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to,
}
backup_set_alter_copy_lock(thd, from);
-
+ DEBUG_SYNC(thd, "copy_data_between_tables_after_set_backup_lock");
alter_table_manage_keys(to, from->file->indexes_are_disabled(), keys_onoff);
from->default_column_bitmaps();
@@ -11178,6 +11178,7 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to,
cleanup_done= 1;
to->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
+ DEBUG_SYNC(thd, "copy_data_between_tables_before_reset_backup_lock");
if (backup_reset_alter_copy_lock(thd))
error= 1;