Browse Source
MDEV-21025 Server crashes on START TRANSACTION after INSERT IGNORE (#1489 )
If a transaction had no effect due to INSERT IGNORE and a new
transaction was started with START TRANSACTION without committing
the previous one, the server crashed on assertion when starting
a new wsrep transaction.
As a fix, refined the condition to do wsrep_commit_empty() at the end
of the ha_commit_trans().
bb-10.4-MDEV-22203
Teemu Ollakka
6 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with
35 additions and
1 deletions
mysql-test/suite/galera/r/mdev_21025.result
mysql-test/suite/galera/t/mdev_21025.test
sql/handler.cc
@ -0,0 +1,11 @@
connection node_2;
connection node_1;
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY);
START TRANSACTION;
INSERT INTO t1 (f1) VALUES (1);
START TRANSACTION;
INSERT IGNORE INTO t1 (f1) VALUES (1);
Warnings:
Warning 1062 Duplicate entry '1' for key 'PRIMARY'
START TRANSACTION;
DROP TABLE t1;
@ -0,0 +1,22 @@
#
# MDEV-21205
#
# Start transaction after INSERT IGNORE which had no effect and
# kept the transaction open caused an assertion on the following
# START TRANSACTION because the empty transaction was not properly
# terminated.
#
--source include/galera_cluster.inc
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY);
START TRANSACTION;
INSERT INTO t1 (f1) VALUES (1);
START TRANSACTION;
# This INSERT succeeds with duplicate key warning due to IGNORE clause
# and keeps the transaction open. The following START TRANSACTION causes
# an assertion if the bug is present.
INSERT IGNORE INTO t1 (f1) VALUES (1);
START TRANSACTION;
DROP TABLE t1;
@ -1705,7 +1705,8 @@ end:
thd - > mdl_context . release_lock ( mdl_request . ticket ) ;
thd - > mdl_context . release_lock ( mdl_request . ticket ) ;
}
}
# ifdef WITH_WSREP
# ifdef WITH_WSREP
if ( wsrep_is_active ( thd ) & & is_real_trans & & ! error & & ( rw_ha_count = = 0 ) & &
if ( wsrep_is_active ( thd ) & & is_real_trans & & ! error & &
( rw_ha_count = = 0 | | all ) & &
wsrep_not_committed ( thd ) )
wsrep_not_committed ( thd ) )
{
{
wsrep_commit_empty ( thd , all ) ;
wsrep_commit_empty ( thd , all ) ;