From e9adcac2e8f663dbfda38ea917e00ca8af18440c Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 31 May 2007 20:01:06 +0200 Subject: [PATCH] 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(). --- sql/log_event.cc | 27 +++++++++++++++++++++++++++ sql/log_event.h | 2 ++ 2 files changed, 29 insertions(+) diff --git a/sql/log_event.cc b/sql/log_event.cc index e53cbd310ea..4351ef93e29 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -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(); diff --git a/sql/log_event.h b/sql/log_event.h index 4e43822cb38..dec7a599410 100644 --- a/sql/log_event.h +++ b/sql/log_event.h @@ -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.