summaryrefslogtreecommitdiff
path: root/sql/ha_sequence.cc
diff options
context:
space:
mode:
authorAndrei <andrei.elkin@mariadb.com>2023-03-18 21:11:07 +0200
committerAndrei <andrei.elkin@mariadb.com>2023-04-27 22:16:33 +0300
commit1d29d52afc1b8e64af45e72937c019a19545cbc3 (patch)
treec821bfd0f1e441ff7001c0be7fba49a5b78915f6 /sql/ha_sequence.cc
parentf21664414da8c4cf26daf5cad012dc0aca028602 (diff)
downloadmariadb-git-bb-10.4-andrei.tar.gz
MDEV-29621: Replica stopped by locks on sequencebb-10.4-andrei
When using binlog_row_image=FULL with sequence table inserts, a replica can deadlock because it treats full inserts in a sequence as DDL statements by getting an exclusive lock on the sequence table. It has been observed that with parallel replication, this exclusive lock on the sequence table can lead to a deadlock where one transaction has the exclusive lock and is waiting on a prior transaction to commit, whereas this prior transaction is waiting on the MDL lock. This fix for this is on the master side, to raise FL_DDL flag on the GTID of a full binlog_row_image INSERT of a sequence table. This forces the slave to execute the statement serially so a deadlock cannot happen. A test verifies the deadlock also to prove it happen on the pre-fixes slave. OLD (buggy) -> NEW (fixed) replication is provided. As the pre-fixes master's full row-image may represent both SELECT NEXT VALUE and INSERT, in case of a buggy master, the fixed parallel slave pessimistically waits in either case for the prior transaction to commit before to take on the critical part of the event execution. The waiting exploits a parallel slave's retry mechanism which is controlled by `@@global.slave_transaction_retries`. Note that in order to avoid any persistent 'Deadlock found' 2013 error in OLD -> NEW, `slave_transaction_retries` may need to be set to a higher than the default value. START-SLAVE is an effective work-around if this still happens.
Diffstat (limited to 'sql/ha_sequence.cc')
-rw-r--r--sql/ha_sequence.cc2
1 files changed, 2 insertions, 0 deletions
diff --git a/sql/ha_sequence.cc b/sql/ha_sequence.cc
index 1331fea74d1..03aee6a43dc 100644
--- a/sql/ha_sequence.cc
+++ b/sql/ha_sequence.cc
@@ -240,6 +240,8 @@ int ha_sequence::write_row(const uchar *buf)
on master and slaves
- Check that the new row is an accurate SEQUENCE object
*/
+ /* mark a full binlog image insert to force non-parallel slave */
+ thd->transaction.stmt.mark_trans_did_ddl();
if (table->s->tmp_table == NO_TMP_TABLE &&
thd->mdl_context.upgrade_shared_lock(table->mdl_ticket,
MDL_EXCLUSIVE,