mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
MDEV-4506: Parallel replication.
Fix some more parts of old-style position updates. Now we save in rgi some coordinates for master log and relay log, so that in do_update_pos() we can use the right set of coordinates with the right events. The Rotate_log_event::do_update_pos() is fixed in the parallel case to not directly update relay-log.info (as Rotate event runs directly in the driver SQL thread, ahead of actual event execution). Instead, group_master_log_file is updated as part of do_update_pos() in each event execution. In the parallel case, position updates happen in parallel without any ordering, but taking care that position is not updated backwards. Since position update happens only after event execution this leads to the right result. Also fix an access-after-free introduced in an earlier commit.
This commit is contained in:
@@ -64,7 +64,11 @@ rpt_handle_event(rpl_parallel_thread::queued_event *qev,
|
||||
/* ToDo: Access to thd, and what about rli, split out a parallel part? */
|
||||
mysql_mutex_lock(&rli->data_lock);
|
||||
qev->ev->thd= thd;
|
||||
strcpy(rgi->event_relay_log_name_buf, qev->event_relay_log_name);
|
||||
rgi->event_relay_log_name= rgi->event_relay_log_name_buf;
|
||||
rgi->event_relay_log_pos= qev->event_relay_log_pos;
|
||||
rgi->future_event_relay_log_pos= qev->future_event_relay_log_pos;
|
||||
strcpy(rgi->future_event_master_log_name, qev->future_event_master_log_name);
|
||||
err= apply_event_and_update_pos(qev->ev, thd, rgi, rpt);
|
||||
thd->rgi_slave= NULL;
|
||||
|
||||
@@ -660,7 +664,10 @@ rpl_parallel::do_event(rpl_group_info *serial_rgi, Log_event *ev)
|
||||
}
|
||||
qev->ev= ev;
|
||||
qev->next= NULL;
|
||||
strcpy(qev->event_relay_log_name, rli->event_relay_log_name);
|
||||
qev->event_relay_log_pos= rli->event_relay_log_pos;
|
||||
qev->future_event_relay_log_pos= rli->future_event_relay_log_pos;
|
||||
strcpy(qev->future_event_master_log_name, rli->future_event_master_log_name);
|
||||
|
||||
if (typ == GTID_EVENT)
|
||||
{
|
||||
@@ -674,6 +681,7 @@ rpl_parallel::do_event(rpl_group_info *serial_rgi, Log_event *ev)
|
||||
delete rgi;
|
||||
return true;
|
||||
}
|
||||
rgi->is_parallel_exec = true;
|
||||
if ((rgi->deferred_events_collecting= rli->mi->rpl_filter->is_on()))
|
||||
rgi->deferred_events= new Deferred_log_events(rli);
|
||||
|
||||
@@ -783,6 +791,14 @@ rpl_parallel::do_event(rpl_group_info *serial_rgi, Log_event *ev)
|
||||
have GTID, like a MariaDB 5.5 or MySQL master.
|
||||
*/
|
||||
qev->rgi= serial_rgi;
|
||||
/* Handle master log name change, seen in Rotate_log_event. */
|
||||
if (typ == ROTATE_EVENT)
|
||||
{
|
||||
Rotate_log_event *rev= static_cast<Rotate_log_event *>(qev->ev);
|
||||
memcpy(rli->future_event_master_log_name,
|
||||
rev->new_log_ident, rev->ident_len+1);
|
||||
}
|
||||
|
||||
rpt_handle_event(qev, NULL);
|
||||
delete_or_keep_event_post_apply(serial_rgi, typ, qev->ev);
|
||||
my_free(qev);
|
||||
|
Reference in New Issue
Block a user