1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-27 18:02:13 +03:00

BUG#28618 (Skipping into the middle of a group with SQL_SLAVE_SKIP_COUNTER

is possible):

When skipping the beginning of a transaction starting with BEGIN, the OPTION_BEGIN
flag was not set correctly, which caused the slave to not recognize that it was
inside a group. This patch sets the OPTION_BEGIN flag for BEGIN, COMMIT, ROLLBACK,
and XID events. It also adds checks if inside a group before decreasing the
slave skip counter to zero.

Begin_query_log_event was not marked that it could not end a group, which is now
corrected.
This commit is contained in:
mats@kindahl-laptop.dnsalias.net
2007-10-19 14:18:41 +02:00
parent a2247b2b3f
commit f2ba11c327
10 changed files with 560 additions and 20 deletions

View File

@ -870,6 +870,25 @@ public:
protected:
/**
Helper function to ignore an event w.r.t. the slave skip counter.
This function can be used inside do_shall_skip() for functions
that cannot end a group. If the slave skip counter is 1 when
seeing such an event, the event shall be ignored, the counter
left intact, and processing continue with the next event.
A typical usage is:
@code
enum_skip_reason do_shall_skip(Relay_log_info *rli) {
return continue_group(rli);
}
@endcode
@return Skip reason
*/
enum_skip_reason continue_group(Relay_log_info *rli);
/**
Primitive to apply an event to the database.
@ -1086,6 +1105,7 @@ public:
public: /* !!! Public in this patch to allow old usage */
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
virtual enum_skip_reason do_shall_skip(Relay_log_info *rli);
virtual int do_apply_event(Relay_log_info const *rli);
virtual int do_update_pos(Relay_log_info *rli);
@ -1559,6 +1579,7 @@ class Xid_log_event: public Log_event
private:
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
virtual int do_apply_event(Relay_log_info const *rli);
enum_skip_reason do_shall_skip(Relay_log_info *rli);
#endif
};
@ -1937,6 +1958,10 @@ public:
*description_event);
~Begin_load_query_log_event() {}
Log_event_type get_type_code() { return BEGIN_LOAD_QUERY_EVENT; }
private:
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
virtual enum_skip_reason do_shall_skip(Relay_log_info *rli);
#endif
};