[Commits] 79e9ff4: MDEV-7458: Deadlock in parallel replication can allow following transaction to start replicating too early

Kristian Nielsen knielsen at knielsen-hq.org
Mon Feb 23 14:37:54 EET 2015


revision-id: 79e9ff44d18f5fb986870cfac17fc661fb098098
parent(s): 41cfdc838e551958b3b1e3a76f1e91040a628786
committer: Kristian Nielsen
branch nick: server
timestamp: 2015-02-23 13:37:34 +0100
message:

MDEV-7458: Deadlock in parallel replication can allow following transaction to start replicating too early

In parallel replication, don't rollback inside ha_commit_trans() in case of
error.

The rollback will be done later, but the parallel replication code needs to
run unmark_start_commit() before the rollback to properly control the
sequencing of transactions.

I did not manage to come up with a reliable automatic test case for this, but
I tested it manually.

---
 sql/handler.cc |    8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/sql/handler.cc b/sql/handler.cc
index 518ca7b..b92db12 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -1445,7 +1445,13 @@ int ha_commit_trans(THD *thd, bool all)
   /* Come here if error and we need to rollback. */
 err:
   error= 1;                                  /* Transaction was rolled back */
-  ha_rollback_trans(thd, all);
+  /*
+    In parallel replication, rollback is delayed, as there is extra replication
+    book-keeping to be done before rolling back and allowing a conflicting
+    transaction to continue (MDEV-7458).
+  */
+  if (!(thd->rgi_slave && thd->rgi_slave->is_parallel_exec))
+    ha_rollback_trans(thd, all);
 
 end:
   if (rw_trans && mdl_request.ticket)


More information about the commits mailing list