Commit e9adcac2 authored by unknown's avatar unknown

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().
parent 6d7d07ab
......@@ -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 @@ int Table_map_log_event::do_apply_event(RELAY_LOG_INFO const *rli)
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 @@ class Table_map_log_event : public Log_event
#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 @@ class Rows_log_event : public Log_event
#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.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment