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:
@ -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
|
||||
};
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user