Skip to content

Commit

Permalink
MW-416 DDL replication moved after acl checking
Browse files Browse the repository at this point in the history
galera_events test shows a regression with the original fix for MW-416
Reason was that Events::drop_event() can be called also from inside event
execution, and there we have a speacial treatment for event, which executes
"DROP EVENT" statement, and runs TOI replication inside the event processing body.
This resulted in executing WSREP_TO_ISOLATION two times for such DROP EVENT statement.
Fix is to call WSREP_TO_ISOLATION_BEGIN only in Events::drop_event()
  • Loading branch information
sjaakola authored and vuvova committed Dec 19, 2017
1 parent 1a8da00 commit 64e1dda
Showing 1 changed file with 22 additions and 8 deletions.
30 changes: 22 additions & 8 deletions sql/event_data_objects.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1472,19 +1472,33 @@ Event_job_data::execute(THD *thd, bool drop)
bool save_tx_read_only= thd->tx_read_only;
thd->tx_read_only= false;

if (WSREP(thd))
{
/*
This code is processing event execution and does not have client
connection. Here, event execution will now execute a prepared
DROP EVENT statement, but thd->lex->sql_command is set to
SQLCOM_CREATE_PROCEDURE
DROP EVENT will be logged in binlog, and we have to
replicate it to make all nodes have consistent event definitions
Wsrep DDL replication is triggered inside Events::drop_event(),
and here we need to prepare the THD so that DDL replication is
possible, essentially it requires setting sql_command to
SQLCOMM_DROP_EVENT, we will switch sql_command for the duration
of DDL replication only.
*/
const enum_sql_command sql_command_save= thd->lex->sql_command;
const bool sql_command_set= WSREP(thd);

if (sql_command_set)
thd->lex->sql_command = SQLCOM_DROP_EVENT;
WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL);
}

ret= Events::drop_event(thd, dbname, name, FALSE);

WSREP_TO_ISOLATION_END;
if (sql_command_set)
{
WSREP_TO_ISOLATION_END;
thd->lex->sql_command = sql_command_save;
}

#ifdef WITH_WSREP
error:
#endif
thd->tx_read_only= save_tx_read_only;
thd->security_ctx->master_access= saved_master_access;
}
Expand Down

0 comments on commit 64e1dda

Please sign in to comment.