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 <kniel...@knielsen-hq.org>
---
 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

_______________________________________________
commits mailing list -- commits@lists.mariadb.org
To unsubscribe send an email to commits-le...@lists.mariadb.org

Reply via email to