BUG#28618 (Skipping into the middle of a group with
SQL_SLAVE_SKIP_COUNTER is possible): By setting the SQL_SLAVE_SKIP_COUNTER it was possible to start the from the middle of a group. This patch adds code so that events that do not end a statement are ignored instead of skip counted when the slave skip counter is 1. sql/log_event.cc: Adding code so that for rows log events where the STMT_END_F is clear and for table map events, the event is ignored when the slave skip counter is 1 instead of skip counted, or described another way, the slave skip counter can only be decreased from 1 to 0 when the STMT_END_F flag is set. sql/log_event.h: Adding functions Table_map_log_event::do_shall_skip() and Rows_log_event::do_shall_skip().
This commit is contained in:
parent
6d7d07ab78
commit
e9adcac2e8
@ -6127,6 +6127,20 @@ int Rows_log_event::do_apply_event(RELAY_LOG_INFO const *rli)
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
Log_event::enum_skip_reason
|
||||
Rows_log_event::do_shall_skip(RELAY_LOG_INFO *rli)
|
||||
{
|
||||
/*
|
||||
If the slave skip counter is 1 and this event does not end a
|
||||
statement, then we should not start executing on the next event.
|
||||
Otherwise, we defer the decision to the normal skipping logic.
|
||||
*/
|
||||
if (rli->slave_skip_counter == 1 && !get_flags(STMT_END_F))
|
||||
return Log_event::EVENT_SKIP_IGNORE;
|
||||
else
|
||||
return Log_event::do_shall_skip(rli);
|
||||
}
|
||||
|
||||
int
|
||||
Rows_log_event::do_update_pos(RELAY_LOG_INFO *rli)
|
||||
{
|
||||
@ -6599,6 +6613,19 @@ err:
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
|
||||
Log_event::enum_skip_reason
|
||||
Table_map_log_event::do_shall_skip(RELAY_LOG_INFO *rli)
|
||||
{
|
||||
/*
|
||||
If the slave skip counter is 1, then we should not start executing
|
||||
on the next event.
|
||||
*/
|
||||
if (rli->slave_skip_counter == 1)
|
||||
return Log_event::EVENT_SKIP_IGNORE;
|
||||
else
|
||||
return Log_event::do_shall_skip(rli);
|
||||
}
|
||||
|
||||
int Table_map_log_event::do_update_pos(RELAY_LOG_INFO *rli)
|
||||
{
|
||||
rli->inc_event_relay_log_pos();
|
||||
|
@ -2066,6 +2066,7 @@ private:
|
||||
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
|
||||
virtual int do_apply_event(RELAY_LOG_INFO const *rli);
|
||||
virtual int do_update_pos(RELAY_LOG_INFO *rli);
|
||||
virtual enum_skip_reason do_shall_skip(RELAY_LOG_INFO *rli);
|
||||
#endif
|
||||
|
||||
#ifndef MYSQL_CLIENT
|
||||
@ -2244,6 +2245,7 @@ private:
|
||||
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
|
||||
virtual int do_apply_event(RELAY_LOG_INFO const *rli);
|
||||
virtual int do_update_pos(RELAY_LOG_INFO *rli);
|
||||
virtual enum_skip_reason do_shall_skip(RELAY_LOG_INFO *rli);
|
||||
|
||||
/*
|
||||
Primitive to prepare for a sequence of row executions.
|
||||
|
Loading…
x
Reference in New Issue
Block a user