summaryrefslogtreecommitdiff
path: root/sql/rpl_parallel.cc
diff options
context:
space:
mode:
authorunknown <knielsen@knielsen-hq.org>2014-03-07 12:02:09 +0100
committerunknown <knielsen@knielsen-hq.org>2014-03-07 12:02:09 +0100
commit2aa619ec68ae2aed567433ae37905eb7fe58fb70 (patch)
tree946ed1bcc07b2ec1ab6a19e03dd9afe167238387 /sql/rpl_parallel.cc
parentfe3c68b38df1a9bd52fc27b9b05eb200d9e8bfc9 (diff)
downloadmariadb-git-2aa619ec68ae2aed567433ae37905eb7fe58fb70.tar.gz
MDEV-5788: Incorrect free of rgi->deferred_events in parallel replication
When an rpl_group_info object was returned from the free list, the rgi->deferred_events_collecting and rgi->deferred_events was not correctly re-inited. Additionally, the rgi->deferred_events was incorrectly freed in free_rgi(), which causes unnecessary malloc/free (or crash when re-init is not done). Thanks to user nanyi607rao, who reported this bug on maria-developers@.
Diffstat (limited to 'sql/rpl_parallel.cc')
-rw-r--r--sql/rpl_parallel.cc10
1 files changed, 3 insertions, 7 deletions
diff --git a/sql/rpl_parallel.cc b/sql/rpl_parallel.cc
index 154a95c1028..58b4948baae 100644
--- a/sql/rpl_parallel.cc
+++ b/sql/rpl_parallel.cc
@@ -789,9 +789,10 @@ rpl_parallel_thread::get_rgi(Relay_log_info *rli, Gtid_log_event *gtid_ev,
return NULL;
}
rgi->is_parallel_exec = true;
- if ((rgi->deferred_events_collecting= rli->mi->rpl_filter->is_on()))
- rgi->deferred_events= new Deferred_log_events(rli);
}
+ if ((rgi->deferred_events_collecting= rli->mi->rpl_filter->is_on()) &&
+ !rgi->deferred_events)
+ rgi->deferred_events= new Deferred_log_events(rli);
if (event_group_new_gtid(rgi, gtid_ev))
{
free_rgi(rgi);
@@ -810,11 +811,6 @@ rpl_parallel_thread::free_rgi(rpl_group_info *rgi)
mysql_mutex_assert_owner(&LOCK_rpl_thread);
DBUG_ASSERT(rgi->commit_orderer.waitee == NULL);
rgi->free_annotate_event();
- if (rgi->deferred_events)
- {
- delete rgi->deferred_events;
- rgi->deferred_events= NULL;
- }
rgi->next= rgi_free_list;
rgi_free_list= rgi;
}