Clear any pending deadlock kill after completing XA PREPARE, and before
updating the mysql.gtid_slave_pos table in a separate transaction.
Signed-off-by: Kristian Nielsen
---
sql/log_event_server.cc | 13 +++++++++++++
sql/rpl_parallel.cc | 2 +-
sql/rpl_parallel.h | 1 +
3 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/sql/log_event_server.cc b/sql/log_event_server.cc
index 003774c24aa..7aa43a14b4d 100644
--- a/sql/log_event_server.cc
+++ b/sql/log_event_server.cc
@@ -4547,6 +4547,19 @@ int XA_prepare_log_event::do_commit()
else
res= trans_xa_commit(thd);
+ if (thd->rgi_slave->is_parallel_exec)
+ {
+ /*
+ Since the transaction is prepared/committed without updating the GTID pos
+ (MDEV-32020...), we need here to clear any pending deadlock kill.
+ Otherwise if the kill happened after the prepare/commit completed, it
+ might end up killing the subsequent GTID position update, causing the
+ slave to fail with error.
+ */
+ wait_for_pending_deadlock_kill(thd, thd->rgi_slave);
+ thd->reset_killed();
+ }
+
return res;
}
#endif // HAVE_REPLICATION
diff --git a/sql/rpl_parallel.cc b/sql/rpl_parallel.cc
index b63642a2f0d..bbfc02110a7 100644
--- a/sql/rpl_parallel.cc
+++ b/sql/rpl_parallel.cc
@@ -131,7 +131,7 @@ handle_queued_pos_update(THD *thd, rpl_parallel_thread::queued_event *qev)
asynchronously, we need to be sure they will be completed before starting a
new transaction. Otherwise the new transaction might suffer a spurious kill.
*/
-static void
+void
wait_for_pending_deadlock_kill(THD *thd, rpl_group_info *rgi)
{
PSI_stage_info old_stage;
diff --git a/sql/rpl_parallel.h b/sql/rpl_parallel.h
index d8ee98f91c6..ef872dec66f 100644
--- a/sql/rpl_parallel.h
+++ b/sql/rpl_parallel.h
@@ -518,6 +518,7 @@ struct rpl_parallel {
extern struct rpl_parallel_thread_pool global_rpl_thread_pool;
+extern void wait_for_pending_deadlock_kill(THD *thd, rpl_group_info *rgi);
extern int rpl_parallel_resize_pool_if_no_slaves(void);
extern int rpl_parallel_activate_pool(rpl_parallel_thread_pool *pool);
extern int rpl_parallel_inactivate_pool(rpl_parallel_thread_pool *pool);
--
2.30.2