mirror of
https://github.com/MariaDB/server.git
synced 2025-07-27 18:02:13 +03:00
MDEV-26: Global transaction ID.
Fix problems related to reconnect. When we need to reconnect (ie. explict stop/start of just the IO thread by user, or automatic reconnect due to loosing network connection with the master), it is a bit complex to correctly resume at the right point without causing duplicate or missing events in the relay log. The previous code had multiple problems in this regard. With this patch, the problem is solved as follows. The IO thread keeps track (in memory) of which GTID was last queued to the relay log. If it needs to reconnect, it resumes at that GTID position. It also counts number of events received within the last, possibly partial, event group, and skips the same number of events after a reconnect, so that events already enqueued before the reconnect are not duplicated. (There is no need to keep any persistent state; whenever we restart slave threads after both of them being stopped (such as after server restart), we erase the relay logs and start over from the last GTID applied by SQL thread. But while the SQL thread is running, this patch is needed to get correct relay log).
This commit is contained in:
@ -32,6 +32,8 @@ typedef struct st_slave_info
|
||||
THD* thd;
|
||||
} SLAVE_INFO;
|
||||
|
||||
class slave_connection_state;
|
||||
|
||||
extern my_bool opt_show_slave_auth_info;
|
||||
extern char *master_host, *master_info_file;
|
||||
extern bool server_id_supplied;
|
||||
@ -70,6 +72,7 @@ void rpl_init_gtid_slave_state();
|
||||
void rpl_deinit_gtid_slave_state();
|
||||
int gtid_state_from_binlog_pos(const char *name, uint32 pos, String *out_str);
|
||||
int rpl_append_gtid_state(String *dest, bool use_binlog);
|
||||
int rpl_load_gtid_state(slave_connection_state *state, bool use_binlog);
|
||||
bool rpl_gtid_pos_check(THD *thd, char *str, size_t len);
|
||||
bool rpl_gtid_pos_update(THD *thd, char *str, size_t len);
|
||||
|
||||
|
Reference in New Issue
Block a user