Skip to content

Commit

Permalink
MDEV-8617: Multiple galera tests failures with --ps-protocol
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Nirbhay Choubey committed Aug 14, 2015
1 parent e998dff commit c18e0da
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 14 deletions.
30 changes: 16 additions & 14 deletions sql/sql_base.cc
Original file line number Diff line number Diff line change
Expand Up @@ -5226,20 +5226,22 @@ bool open_tables(THD *thd, TABLE_LIST **start, uint *counter, uint flags,
}
}
#ifdef WITH_WSREP
if ((thd->lex->sql_command== SQLCOM_INSERT ||
thd->lex->sql_command== SQLCOM_INSERT_SELECT ||
thd->lex->sql_command== SQLCOM_REPLACE ||
thd->lex->sql_command== SQLCOM_REPLACE_SELECT ||
thd->lex->sql_command== SQLCOM_UPDATE ||
thd->lex->sql_command== SQLCOM_UPDATE_MULTI ||
thd->lex->sql_command== SQLCOM_LOAD ||
thd->lex->sql_command== SQLCOM_DELETE) &&
wsrep_replicate_myisam &&
(*start) &&
(*start)->table && (*start)->table->file->ht->db_type == DB_TYPE_MYISAM)
{
WSREP_TO_ISOLATION_BEGIN(NULL, NULL, (*start));
}
if (wsrep_replicate_myisam &&
(*start) &&
(*start)->table &&
(*start)->table->file->ht->db_type == DB_TYPE_MYISAM &&
thd->get_command() != COM_STMT_PREPARE &&
((thd->lex->sql_command == SQLCOM_INSERT ||
thd->lex->sql_command == SQLCOM_INSERT_SELECT ||
thd->lex->sql_command == SQLCOM_REPLACE ||
thd->lex->sql_command == SQLCOM_REPLACE_SELECT ||
thd->lex->sql_command == SQLCOM_UPDATE ||
thd->lex->sql_command == SQLCOM_UPDATE_MULTI ||
thd->lex->sql_command == SQLCOM_LOAD ||
thd->lex->sql_command == SQLCOM_DELETE)))
{
WSREP_TO_ISOLATION_BEGIN(NULL, NULL, (*start));
}
error:
#endif

Expand Down
2 changes: 2 additions & 0 deletions sql/sql_class.h
Original file line number Diff line number Diff line change
Expand Up @@ -3076,6 +3076,8 @@ class THD :public Statement,
public:
/** Overloaded to guard query/query_length fields */
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.
Expand Down
5 changes: 5 additions & 0 deletions sql/sql_parse.cc
Original file line number Diff line number Diff line change
Expand Up @@ -862,6 +862,11 @@ bool do_command(THD *thd)
command != COM_SLEEP &&
command != COM_STATISTICS &&
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
) {
my_message(ER_UNKNOWN_COM_ERROR,
Expand Down

0 comments on commit c18e0da

Please sign in to comment.