mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
ad432ef4c0
This PR fixes same issue as MDEV-21577 for TRUNCATE TABLE. MDEV-21577 fixed TOI replication for OPTIMIZE, REPAIR and ALTER TABLE operating on FK child table. It was later found out that also TRUNCATE has similar problem and needs a fix. The actual fix is to do FK parent table lookup before TRUNCATE TOI isolation and append found FK parent table names in certification key list for the write set. PR contains also new test scenario in galera_ddl_fk_conflict test where FK child has two FK parent tables and there are two DML transactions operating on both parent tables. For development convenience, new TO isolation macro was added: WSREP_TO_ISOLATION_BEGIN_IF and WSREP_TO_ISOLATION_BEGIN_ALTER macro was changed to skip the goto statement. Reviewed-by: Jan Lindström <jan.lindstrom@mariadb.com>
84 lines
3.7 KiB
C
84 lines
3.7 KiB
C
/* Copyright 2014 Codership Oy <http://www.codership.com> & SkySQL Ab
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; version 2 of the License.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
|
|
|
|
#ifndef WSREP_INCLUDED
|
|
#define WSREP_INCLUDED
|
|
|
|
#include <my_config.h>
|
|
|
|
#ifdef WITH_WSREP
|
|
#define IF_WSREP(A,B) A
|
|
#define DBUG_ASSERT_IF_WSREP(A) DBUG_ASSERT(A)
|
|
|
|
#define WSREP_MYSQL_DB (char *)"mysql"
|
|
#define WSREP_TO_ISOLATION_BEGIN_IF(db_, table_, table_list_) \
|
|
if (WSREP_ON && WSREP(thd) && wsrep_to_isolation_begin(thd, db_, table_, table_list_))
|
|
|
|
#define WSREP_TO_ISOLATION_BEGIN(db_, table_, table_list_) \
|
|
if (WSREP_ON && WSREP(thd) && wsrep_to_isolation_begin(thd, db_, table_, table_list_)) \
|
|
goto wsrep_error_label;
|
|
|
|
#define WSREP_TO_ISOLATION_BEGIN_ALTER(db_, table_, table_list_, alter_info_, fk_tables_) \
|
|
if (WSREP(thd) && wsrep_thd_is_local(thd) && \
|
|
wsrep_to_isolation_begin(thd, db_, table_, \
|
|
table_list_, alter_info_, fk_tables_))
|
|
|
|
#define WSREP_TO_ISOLATION_END \
|
|
if ((WSREP(thd) && wsrep_thd_is_local_toi(thd)) || \
|
|
wsrep_thd_is_in_rsu(thd)) \
|
|
wsrep_to_isolation_end(thd);
|
|
|
|
/*
|
|
Checks if lex->no_write_to_binlog is set for statements that use LOCAL or
|
|
NO_WRITE_TO_BINLOG.
|
|
*/
|
|
#define WSREP_TO_ISOLATION_BEGIN_WRTCHK(db_, table_, table_list_) \
|
|
if (WSREP(thd) && !thd->lex->no_write_to_binlog \
|
|
&& wsrep_to_isolation_begin(thd, db_, table_, table_list_)) goto wsrep_error_label;
|
|
|
|
#define WSREP_TO_ISOLATION_BEGIN_FK_TABLES(db_, table_, table_list_, fk_tables) \
|
|
if (WSREP(thd) && !thd->lex->no_write_to_binlog \
|
|
&& wsrep_to_isolation_begin(thd, db_, table_, table_list_, NULL, fk_tables))
|
|
|
|
#define WSREP_DEBUG(...) \
|
|
if (wsrep_debug) WSREP_LOG(sql_print_information, ##__VA_ARGS__)
|
|
#define WSREP_INFO(...) WSREP_LOG(sql_print_information, ##__VA_ARGS__)
|
|
#define WSREP_WARN(...) WSREP_LOG(sql_print_warning, ##__VA_ARGS__)
|
|
#define WSREP_ERROR(...) WSREP_LOG(sql_print_error, ##__VA_ARGS__)
|
|
|
|
#define WSREP_SYNC_WAIT(thd_, before_) \
|
|
{ if (WSREP_CLIENT(thd_) && \
|
|
wsrep_sync_wait(thd_, before_)) goto wsrep_error_label; }
|
|
|
|
#else /* !WITH_WSREP */
|
|
|
|
/* These macros are needed to compile MariaDB without WSREP support
|
|
* (e.g. embedded) */
|
|
|
|
#define IF_WSREP(A,B) B
|
|
//#define DBUG_ASSERT_IF_WSREP(A)
|
|
#define WSREP_DEBUG(...)
|
|
//#define WSREP_INFO(...)
|
|
//#define WSREP_WARN(...)
|
|
#define WSREP_ERROR(...)
|
|
#define WSREP_TO_ISOLATION_BEGIN(db_, table_, table_list_) do { } while(0)
|
|
#define WSREP_TO_ISOLATION_BEGIN_ALTER(db_, table_, table_list_, alter_info_)
|
|
#define WSREP_TO_ISOLATION_BEGIN_FK_TABLES(db_, table_, table_list_, fk_tables_)
|
|
#define WSREP_TO_ISOLATION_END
|
|
#define WSREP_TO_ISOLATION_BEGIN_WRTCHK(db_, table_, table_list_)
|
|
#define WSREP_SYNC_WAIT(thd_, before_)
|
|
#endif /* WITH_WSREP */
|
|
|
|
#endif /* WSREP_INCLUDED */
|