diff options
author | Vlad Lesin <vlad_lesin@mail.ru> | 2021-06-11 18:57:34 +0300 |
---|---|---|
committer | Vlad Lesin <vlad_lesin@mail.ru> | 2021-06-11 19:17:18 +0300 |
commit | 290ac78e933702307112f07e02ccabe089234d33 (patch) | |
tree | a430331aaebe2af6b20c3a735644620b3d903ebf | |
parent | 1bd681c8b3c5213ce1f7976940a7dc38b48a0d39 (diff) | |
download | mariadb-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.cc | 15 | ||||
-rw-r--r-- | extra/mariabackup/xtrabackup.cc | 25 | ||||
-rw-r--r-- | extra/mariabackup/xtrabackup.h | 6 | ||||
-rw-r--r-- | mysql-test/suite/mariabackup/innodb_ddl_on_intermediate_table.test | 19 | ||||
-rw-r--r-- | sql/sql_table.cc | 3 |
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; |