mirror of
https://github.com/MariaDB/server.git
synced 2025-08-30 11:22:14 +03:00
MDEV-8302: Duplicate key with parallel replication
This bug is essentially another variant of MDEV-7458. If a transaction conflict caused a deadlock kill of T2 in record_gtid() during commit, the code would do a rollback _before_ running rgi->unmark_start_commit(). This creates a race where following transactions could start too early (before T2 has completed its transaction retry). This in turn could lead to replication failure, if there was a conflict that caused eg. duplicate key error or similar. The fix is to remove these rollbacks (in Query_log_event::do_apply_event() and Xid_log_event::do_apply_event(). They seem out-of-place; code in log_event.cc generally does not roll back on error, this is handled higher up. In addition, because of the extreme difficulty of reproducing bugs like MDEV-7458 and MDEV-8302, this patch adds some extra precations to try to detect (in debug builds) or prevent (in release builds) similar bugs. ha_rollback_trans() will now call unmark_start_commit() if needed (and assert in debug build when a caller does rollback without unmark first). We also add an extra check for thd->killed() so that we avoid doing mark_start_commit() if we already have a pending deadlock kill. And we add a missing unmark_start_commit() call in the error case, found by the above assertion.
This commit is contained in:
@@ -1649,6 +1649,46 @@ include/stop_slave.inc
|
||||
SET GLOBAL debug_dbug= @old_debg;
|
||||
SET GLOBAL max_relay_log_size= @old_max;
|
||||
include/start_slave.inc
|
||||
*** MDEV-8302: Duplicate key with parallel replication ***
|
||||
include/stop_slave.inc
|
||||
/* Inject a small sleep which makes the race easier to hit. */
|
||||
SET @old_dbug=@@GLOBAL.debug_dbug;
|
||||
SET GLOBAL debug_dbug="+d,inject_mdev8302";
|
||||
INSERT INTO t7 VALUES (100,1), (101,2), (102,3), (103,4), (104,5);
|
||||
SET @old_dbug= @@SESSION.debug_dbug;
|
||||
SET @commit_id= 20000;
|
||||
SET SESSION debug_dbug="+d,binlog_force_commit_id";
|
||||
SET SESSION debug_dbug=@old_dbug;
|
||||
SELECT * FROM t7 ORDER BY a;
|
||||
a b
|
||||
1 1
|
||||
2 2
|
||||
3 86
|
||||
4 4
|
||||
5 5
|
||||
100 5
|
||||
101 1
|
||||
102 2
|
||||
103 3
|
||||
104 4
|
||||
include/save_master_gtid.inc
|
||||
include/start_slave.inc
|
||||
include/sync_with_master_gtid.inc
|
||||
SELECT * FROM t7 ORDER BY a;
|
||||
a b
|
||||
1 1
|
||||
2 2
|
||||
3 86
|
||||
4 4
|
||||
5 5
|
||||
100 5
|
||||
101 1
|
||||
102 2
|
||||
103 3
|
||||
104 4
|
||||
include/stop_slave.inc
|
||||
SET GLOBAL debug_dbug=@old_dbug;
|
||||
include/start_slave.inc
|
||||
include/stop_slave.inc
|
||||
SET GLOBAL slave_parallel_threads=@old_parallel_threads;
|
||||
include/start_slave.inc
|
||||
|
Reference in New Issue
Block a user