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.
This commit is contained in:
Kristian Nielsen 2015-02-23 13:37:34 +01:00
parent 41cfdc838e
commit 79e9ff44d1

View File

@ -1445,7 +1445,13 @@ done:
/* 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)