mirror of
https://github.com/MariaDB/server.git
synced 2025-08-09 22:24:09 +03:00
MDEV-8617: Multiple galera tests failures with --ps-protocol
In galera cluster, when myisam replication is enabled (wsrep_replicate_myisam=ON), DML statements are replicated in open_tables(). However, in case of prepared statements, for an INSERT, open_tables() gets invoked twice. Once for COM_STMT_PREPARE (to validate and prepare INSERT) and later for COM_STMT_EXECUTE. As a result, the command gets replicated twice. Same happens for REPLACE, UPDATE and DELETE commands. Fixed by adding a check to not replicate during 'prepare' phase. Also changed the order of conditions to make it more efficient. Lastly, in order to support wsrep_dirty_reads, made changes to allow COM_STMT_XXX commands to continue past initial check even when wsrep is not ready.
This commit is contained in:
@@ -5226,20 +5226,22 @@ restart:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifdef WITH_WSREP
|
#ifdef WITH_WSREP
|
||||||
if ((thd->lex->sql_command== SQLCOM_INSERT ||
|
if (wsrep_replicate_myisam &&
|
||||||
thd->lex->sql_command== SQLCOM_INSERT_SELECT ||
|
(*start) &&
|
||||||
thd->lex->sql_command== SQLCOM_REPLACE ||
|
(*start)->table &&
|
||||||
thd->lex->sql_command== SQLCOM_REPLACE_SELECT ||
|
(*start)->table->file->ht->db_type == DB_TYPE_MYISAM &&
|
||||||
thd->lex->sql_command== SQLCOM_UPDATE ||
|
thd->get_command() != COM_STMT_PREPARE &&
|
||||||
thd->lex->sql_command== SQLCOM_UPDATE_MULTI ||
|
((thd->lex->sql_command == SQLCOM_INSERT ||
|
||||||
thd->lex->sql_command== SQLCOM_LOAD ||
|
thd->lex->sql_command == SQLCOM_INSERT_SELECT ||
|
||||||
thd->lex->sql_command== SQLCOM_DELETE) &&
|
thd->lex->sql_command == SQLCOM_REPLACE ||
|
||||||
wsrep_replicate_myisam &&
|
thd->lex->sql_command == SQLCOM_REPLACE_SELECT ||
|
||||||
(*start) &&
|
thd->lex->sql_command == SQLCOM_UPDATE ||
|
||||||
(*start)->table && (*start)->table->file->ht->db_type == DB_TYPE_MYISAM)
|
thd->lex->sql_command == SQLCOM_UPDATE_MULTI ||
|
||||||
{
|
thd->lex->sql_command == SQLCOM_LOAD ||
|
||||||
WSREP_TO_ISOLATION_BEGIN(NULL, NULL, (*start));
|
thd->lex->sql_command == SQLCOM_DELETE)))
|
||||||
}
|
{
|
||||||
|
WSREP_TO_ISOLATION_BEGIN(NULL, NULL, (*start));
|
||||||
|
}
|
||||||
error:
|
error:
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -3076,6 +3076,8 @@ private:
|
|||||||
public:
|
public:
|
||||||
/** Overloaded to guard query/query_length fields */
|
/** Overloaded to guard query/query_length fields */
|
||||||
virtual void set_statement(Statement *stmt);
|
virtual void set_statement(Statement *stmt);
|
||||||
|
inline enum enum_server_command get_command() const
|
||||||
|
{ return command; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Assign a new value to thd->query and thd->query_id and mysys_var.
|
Assign a new value to thd->query and thd->query_id and mysys_var.
|
||||||
|
@@ -862,6 +862,11 @@ bool do_command(THD *thd)
|
|||||||
command != COM_SLEEP &&
|
command != COM_SLEEP &&
|
||||||
command != COM_STATISTICS &&
|
command != COM_STATISTICS &&
|
||||||
command != COM_TIME &&
|
command != COM_TIME &&
|
||||||
|
command != COM_STMT_PREPARE &&
|
||||||
|
command != COM_STMT_SEND_LONG_DATA &&
|
||||||
|
command != COM_STMT_EXECUTE &&
|
||||||
|
command != COM_STMT_RESET &&
|
||||||
|
command != COM_STMT_CLOSE &&
|
||||||
command != COM_END
|
command != COM_END
|
||||||
) {
|
) {
|
||||||
my_message(ER_UNKNOWN_COM_ERROR,
|
my_message(ER_UNKNOWN_COM_ERROR,
|
||||||
|
Reference in New Issue
Block a user