1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

MDEV-34042: Deadlock kill of XA PREPARE can break replication / rpl.rpl_parallel_multi_domain_xa sporadic failure

Clear any pending deadlock kill after completing XA PREPARE, and before
updating the mysql.gtid_slave_pos table in a separate transaction.

Reviewed-by: Andrei Elkin <andrei.elkin@mariadb.com>
Signed-off-by: Kristian Nielsen <knielsen@knielsen-hq.org>
This commit is contained in:
Kristian Nielsen
2024-04-30 19:21:24 +02:00
parent e365877bae
commit 596921dab8
3 changed files with 15 additions and 1 deletions

View File

@ -4209,6 +4209,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

View File

@ -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;

View File

@ -494,6 +494,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);