From 059222ea882d26e3e59eebfb66b6e699fc50e975 Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Wed, 18 Jan 2023 16:52:08 +0300 Subject: MDEV-25292 Disable atomic replace for slave-generated or-replace Also fixes wrong rollback of ddl_log_state_rm in case of non-atomic replace. There is no backup to remove in that case. --- mysql-test/suite/rpl/r/create_or_replace_mix.result | 2 +- mysql-test/suite/rpl/r/create_or_replace_statement.result | 2 +- sql/handler.h | 3 ++- sql/sql_table.cc | 7 ++++++- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/mysql-test/suite/rpl/r/create_or_replace_mix.result b/mysql-test/suite/rpl/r/create_or_replace_mix.result index 4d452d7d74e..fbcdc0ecc44 100644 --- a/mysql-test/suite/rpl/r/create_or_replace_mix.result +++ b/mysql-test/suite/rpl/r/create_or_replace_mix.result @@ -150,7 +150,7 @@ slave-bin.000001 # Query # # use `test`; create table t4 (server_2_to_be_delete slave-bin.000001 # Gtid # # GTID #-#-# slave-bin.000001 # Query # # use `test`; create table t1 (new_table int) slave-bin.000001 # Gtid # # BEGIN GTID #-#-# -slave-bin.000001 # Query # # use `test`; CREATE TABLE `t2` ( +slave-bin.000001 # Query # # use `test`; CREATE OR REPLACE TABLE `t2` ( `a` int(11) DEFAULT NULL ) slave-bin.000001 # Annotate_rows # # create table t2 select * from t9 diff --git a/mysql-test/suite/rpl/r/create_or_replace_statement.result b/mysql-test/suite/rpl/r/create_or_replace_statement.result index 4d452d7d74e..fbcdc0ecc44 100644 --- a/mysql-test/suite/rpl/r/create_or_replace_statement.result +++ b/mysql-test/suite/rpl/r/create_or_replace_statement.result @@ -150,7 +150,7 @@ slave-bin.000001 # Query # # use `test`; create table t4 (server_2_to_be_delete slave-bin.000001 # Gtid # # GTID #-#-# slave-bin.000001 # Query # # use `test`; create table t1 (new_table int) slave-bin.000001 # Gtid # # BEGIN GTID #-#-# -slave-bin.000001 # Query # # use `test`; CREATE TABLE `t2` ( +slave-bin.000001 # Query # # use `test`; CREATE OR REPLACE TABLE `t2` ( `a` int(11) DEFAULT NULL ) slave-bin.000001 # Annotate_rows # # create table t2 select * from t9 diff --git a/sql/handler.h b/sql/handler.h index e68fa42a926..d963611e7ac 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -2472,7 +2472,8 @@ struct Table_specification_st: public HA_CREATE_INFO, } bool is_atomic_replace() const { - return or_replace() && is_atomic_replace_usable(); + return or_replace() && !or_replace_slave_generated() && + is_atomic_replace_usable(); } }; diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 81603a61be1..b6b94ba989d 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -4409,6 +4409,8 @@ bool HA_CREATE_INFO::finalize_atomic_replace(THD *thd, TABLE_LIST *orig_table) char path[FN_REFLEN + 1]; cpath.str= path; + DBUG_ASSERT(is_atomic_replace()); + debug_crash_here("ddl_log_create_before_install_new"); if (old_hton) { @@ -4509,7 +4511,10 @@ void HA_CREATE_INFO::finalize_ddl(THD *thd, bool roll_back) debug_crash_here("ddl_log_create_log_complete"); ddl_log_complete(ddl_log_state_create); debug_crash_here("ddl_log_create_log_complete2"); - (void) ddl_log_revert(thd, ddl_log_state_rm); + if (is_atomic_replace()) + (void) ddl_log_revert(thd, ddl_log_state_rm); + else + ddl_log_complete(ddl_log_state_rm); debug_crash_here("ddl_log_create_log_complete3"); } } -- cgit v1.2.1