diff options
author | Teemu Ollakka <teemu.ollakka@galeracluster.com> | 2019-02-19 14:08:29 +0200 |
---|---|---|
committer | Jan Lindström <jan.lindstrom@mariadb.com> | 2019-02-25 08:31:52 +0200 |
commit | 6edfeb82fdf95f753b1ee4a1858ddc7740eaaab1 (patch) | |
tree | a3b1c58a0703c87e92bf0eb8cd246e66f5b19450 | |
parent | 31b65d3dd211826b194a9a2e6894816ccd05b707 (diff) | |
download | mariadb-git-6edfeb82fdf95f753b1ee4a1858ddc7740eaaab1.tar.gz |
Fixes to streaming replication BF aborts
The InnoDB DeadlockChecker::check_and_resolve() was missing a
call to wsrep_handle_SR_rollback() in the case when the
transaction running deadlock detection was chosen as victim.
Refined wsrep_handle_SR_rollback() to skip store_globals() calls
if the transaction was BF aborting itself.
Made mysql-wsrep-features#165 more deterministic by waiting until
the update is in progress before sending next update.
-rw-r--r-- | mysql-test/suite/galera_sr/r/mysql-wsrep-features#165.result | 293 | ||||
-rw-r--r-- | mysql-test/suite/galera_sr/t/mysql-wsrep-features#165.inc | 5 | ||||
-rw-r--r-- | sql/service_wsrep.cc | 12 | ||||
-rw-r--r-- | storage/innobase/lock/lock0lock.cc | 6 | ||||
m--------- | wsrep-lib | 0 |
5 files changed, 313 insertions, 3 deletions
diff --git a/mysql-test/suite/galera_sr/r/mysql-wsrep-features#165.result b/mysql-test/suite/galera_sr/r/mysql-wsrep-features#165.result index fe0761d186d..8ad3ac63438 100644 --- a/mysql-test/suite/galera_sr/r/mysql-wsrep-features#165.result +++ b/mysql-test/suite/galera_sr/r/mysql-wsrep-features#165.result @@ -1,35 +1,55 @@ +connection node_2; +connection node_1; +connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1; +connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1; +connect node_1c, 127.0.0.1, root, , test, $NODE_MYPORT_1; +connection node_1; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 VARCHAR(1)) ENGINE=InnoDB; INSERT INTO t1 VALUES (1, 'x'), (2, 'x'), (4, 'x'), (5, 'x'); +connection node_1a; START TRANSACTION; UPDATE t1 SET f2 = 'a' WHERE f1 = 1; UPDATE t1 SET f2 = 'a' WHERE f1 = 4; UPDATE t1 SET f2 = 'a' WHERE f1 = 5; +connection node_1b; START TRANSACTION; SET SESSION wsrep_trx_fragment_size = 1; INSERT INTO t1 VALUES (3, 'b'); UPDATE t1 SET f2 = 'b' WHERE f1 = 2; +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1a; UPDATE t1 SET f2 = 'a' WHERE f1 = 2; +connection node_1; +connection node_1b; SET DEBUG_SYNC = 'wsrep_before_SR_rollback SIGNAL wait WAIT_FOR continue'; UPDATE t1 SET f2 = 'b' WHERE f1 = 1; +connection node_1; SET DEBUG_SYNC = 'now WAIT_FOR wait'; +connection node_1; SET DEBUG_SYNC = 'now SIGNAL continue'; +connection node_1c; UPDATE t1 SET f2 = 'x' WHERE f1 = 3; +connection node_1a; COMMIT; +connection node_1b; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +connection node_1; SELECT * FROM t1; f1 f2 1 a @@ -37,6 +57,7 @@ f1 f2 3 x 4 a 5 a +connection node_2; SELECT * FROM t1; f1 f2 1 a @@ -44,39 +65,56 @@ f1 f2 3 x 4 a 5 a +connection node_1; +SET DEBUG_SYNC = 'RESET'; DROP TABLE t1; +connection node_1; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 VARCHAR(1)) ENGINE=InnoDB; INSERT INTO t1 VALUES (1, 'x'), (2, 'x'), (4, 'x'), (5, 'x'); +connection node_1a; START TRANSACTION; UPDATE t1 SET f2 = 'a' WHERE f1 = 1; UPDATE t1 SET f2 = 'a' WHERE f1 = 4; UPDATE t1 SET f2 = 'a' WHERE f1 = 5; +connection node_1b; START TRANSACTION; SET SESSION wsrep_trx_fragment_size = 1; INSERT INTO t1 VALUES (3, 'b'); UPDATE t1 SET f2 = 'b' WHERE f1 = 2; +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1a; UPDATE t1 SET f2 = 'a' WHERE f1 = 2; +connection node_1; +connection node_1b; SET DEBUG_SYNC = 'wsrep_before_SR_rollback SIGNAL wait WAIT_FOR continue'; UPDATE t1 SET f2 = 'b' WHERE f1 = 1; +connection node_1; SET DEBUG_SYNC = 'now WAIT_FOR wait'; +connection node_1; SET DEBUG_SYNC = 'now SIGNAL continue'; +connection node_1c; UPDATE t1 SET f2 = 'x' WHERE f1 = 3; +connection node_1a; COMMIT; +connection node_1b; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +connection node_1; SELECT * FROM t1; f1 f2 1 a @@ -84,6 +122,7 @@ f1 f2 3 x 4 a 5 a +connection node_2; SELECT * FROM t1; f1 f2 1 a @@ -91,39 +130,56 @@ f1 f2 3 x 4 a 5 a +connection node_1; +SET DEBUG_SYNC = 'RESET'; DROP TABLE t1; +connection node_1; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 VARCHAR(1)) ENGINE=InnoDB; INSERT INTO t1 VALUES (1, 'x'), (2, 'x'), (4, 'x'), (5, 'x'); +connection node_1a; START TRANSACTION; UPDATE t1 SET f2 = 'a' WHERE f1 = 1; UPDATE t1 SET f2 = 'a' WHERE f1 = 4; UPDATE t1 SET f2 = 'a' WHERE f1 = 5; +connection node_1b; START TRANSACTION; SET SESSION wsrep_trx_fragment_size = 1; INSERT INTO t1 VALUES (3, 'b'); UPDATE t1 SET f2 = 'b' WHERE f1 = 2; +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1a; UPDATE t1 SET f2 = 'a' WHERE f1 = 2; +connection node_1; +connection node_1b; SET DEBUG_SYNC = 'wsrep_before_SR_rollback SIGNAL wait WAIT_FOR continue'; UPDATE t1 SET f2 = 'b' WHERE f1 = 1; +connection node_1; SET DEBUG_SYNC = 'now WAIT_FOR wait'; +connection node_1; SET DEBUG_SYNC = 'now SIGNAL continue'; +connection node_1c; UPDATE t1 SET f2 = 'x' WHERE f1 = 3; +connection node_1a; COMMIT; +connection node_1b; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +connection node_1; SELECT * FROM t1; f1 f2 1 a @@ -131,6 +187,7 @@ f1 f2 3 x 4 a 5 a +connection node_2; SELECT * FROM t1; f1 f2 1 a @@ -138,39 +195,56 @@ f1 f2 3 x 4 a 5 a +connection node_1; +SET DEBUG_SYNC = 'RESET'; DROP TABLE t1; +connection node_1; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 VARCHAR(1)) ENGINE=InnoDB; INSERT INTO t1 VALUES (1, 'x'), (2, 'x'), (4, 'x'), (5, 'x'); +connection node_1a; START TRANSACTION; UPDATE t1 SET f2 = 'a' WHERE f1 = 1; UPDATE t1 SET f2 = 'a' WHERE f1 = 4; UPDATE t1 SET f2 = 'a' WHERE f1 = 5; +connection node_1b; START TRANSACTION; SET SESSION wsrep_trx_fragment_size = 1; INSERT INTO t1 VALUES (3, 'b'); UPDATE t1 SET f2 = 'b' WHERE f1 = 2; +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1a; UPDATE t1 SET f2 = 'a' WHERE f1 = 2; +connection node_1; +connection node_1b; SET DEBUG_SYNC = 'wsrep_before_SR_rollback SIGNAL wait WAIT_FOR continue'; UPDATE t1 SET f2 = 'b' WHERE f1 = 1; +connection node_1; SET DEBUG_SYNC = 'now WAIT_FOR wait'; +connection node_1; SET DEBUG_SYNC = 'now SIGNAL continue'; +connection node_1c; UPDATE t1 SET f2 = 'x' WHERE f1 = 3; +connection node_1a; COMMIT; +connection node_1b; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +connection node_1; SELECT * FROM t1; f1 f2 1 a @@ -178,6 +252,7 @@ f1 f2 3 x 4 a 5 a +connection node_2; SELECT * FROM t1; f1 f2 1 a @@ -185,39 +260,56 @@ f1 f2 3 x 4 a 5 a +connection node_1; +SET DEBUG_SYNC = 'RESET'; DROP TABLE t1; +connection node_1; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 VARCHAR(1)) ENGINE=InnoDB; INSERT INTO t1 VALUES (1, 'x'), (2, 'x'), (4, 'x'), (5, 'x'); +connection node_1a; START TRANSACTION; UPDATE t1 SET f2 = 'a' WHERE f1 = 1; UPDATE t1 SET f2 = 'a' WHERE f1 = 4; UPDATE t1 SET f2 = 'a' WHERE f1 = 5; +connection node_1b; START TRANSACTION; SET SESSION wsrep_trx_fragment_size = 1; INSERT INTO t1 VALUES (3, 'b'); UPDATE t1 SET f2 = 'b' WHERE f1 = 2; +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1a; UPDATE t1 SET f2 = 'a' WHERE f1 = 2; +connection node_1; +connection node_1b; SET DEBUG_SYNC = 'wsrep_before_SR_rollback SIGNAL wait WAIT_FOR continue'; UPDATE t1 SET f2 = 'b' WHERE f1 = 1; +connection node_1; SET DEBUG_SYNC = 'now WAIT_FOR wait'; +connection node_1; SET DEBUG_SYNC = 'now SIGNAL continue'; +connection node_1c; UPDATE t1 SET f2 = 'x' WHERE f1 = 3; +connection node_1a; COMMIT; +connection node_1b; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +connection node_1; SELECT * FROM t1; f1 f2 1 a @@ -225,6 +317,7 @@ f1 f2 3 x 4 a 5 a +connection node_2; SELECT * FROM t1; f1 f2 1 a @@ -232,39 +325,56 @@ f1 f2 3 x 4 a 5 a +connection node_1; +SET DEBUG_SYNC = 'RESET'; DROP TABLE t1; +connection node_1; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 VARCHAR(1)) ENGINE=InnoDB; INSERT INTO t1 VALUES (1, 'x'), (2, 'x'), (4, 'x'), (5, 'x'); +connection node_1a; START TRANSACTION; UPDATE t1 SET f2 = 'a' WHERE f1 = 1; UPDATE t1 SET f2 = 'a' WHERE f1 = 4; UPDATE t1 SET f2 = 'a' WHERE f1 = 5; +connection node_1b; START TRANSACTION; SET SESSION wsrep_trx_fragment_size = 1; INSERT INTO t1 VALUES (3, 'b'); UPDATE t1 SET f2 = 'b' WHERE f1 = 2; +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1a; UPDATE t1 SET f2 = 'a' WHERE f1 = 2; +connection node_1; +connection node_1b; SET DEBUG_SYNC = 'wsrep_before_SR_rollback SIGNAL wait WAIT_FOR continue'; UPDATE t1 SET f2 = 'b' WHERE f1 = 1; +connection node_1; SET DEBUG_SYNC = 'now WAIT_FOR wait'; +connection node_1; SET DEBUG_SYNC = 'now SIGNAL continue'; +connection node_1c; UPDATE t1 SET f2 = 'x' WHERE f1 = 3; +connection node_1a; COMMIT; +connection node_1b; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +connection node_1; SELECT * FROM t1; f1 f2 1 a @@ -272,6 +382,7 @@ f1 f2 3 x 4 a 5 a +connection node_2; SELECT * FROM t1; f1 f2 1 a @@ -279,39 +390,56 @@ f1 f2 3 x 4 a 5 a +connection node_1; +SET DEBUG_SYNC = 'RESET'; DROP TABLE t1; +connection node_1; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 VARCHAR(1)) ENGINE=InnoDB; INSERT INTO t1 VALUES (1, 'x'), (2, 'x'), (4, 'x'), (5, 'x'); +connection node_1a; START TRANSACTION; UPDATE t1 SET f2 = 'a' WHERE f1 = 1; UPDATE t1 SET f2 = 'a' WHERE f1 = 4; UPDATE t1 SET f2 = 'a' WHERE f1 = 5; +connection node_1b; START TRANSACTION; SET SESSION wsrep_trx_fragment_size = 1; INSERT INTO t1 VALUES (3, 'b'); UPDATE t1 SET f2 = 'b' WHERE f1 = 2; +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1a; UPDATE t1 SET f2 = 'a' WHERE f1 = 2; +connection node_1; +connection node_1b; SET DEBUG_SYNC = 'wsrep_before_SR_rollback SIGNAL wait WAIT_FOR continue'; UPDATE t1 SET f2 = 'b' WHERE f1 = 1; +connection node_1; SET DEBUG_SYNC = 'now WAIT_FOR wait'; +connection node_1; SET DEBUG_SYNC = 'now SIGNAL continue'; +connection node_1c; UPDATE t1 SET f2 = 'x' WHERE f1 = 3; +connection node_1a; COMMIT; +connection node_1b; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +connection node_1; SELECT * FROM t1; f1 f2 1 a @@ -319,6 +447,7 @@ f1 f2 3 x 4 a 5 a +connection node_2; SELECT * FROM t1; f1 f2 1 a @@ -326,39 +455,56 @@ f1 f2 3 x 4 a 5 a +connection node_1; +SET DEBUG_SYNC = 'RESET'; DROP TABLE t1; +connection node_1; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 VARCHAR(1)) ENGINE=InnoDB; INSERT INTO t1 VALUES (1, 'x'), (2, 'x'), (4, 'x'), (5, 'x'); +connection node_1a; START TRANSACTION; UPDATE t1 SET f2 = 'a' WHERE f1 = 1; UPDATE t1 SET f2 = 'a' WHERE f1 = 4; UPDATE t1 SET f2 = 'a' WHERE f1 = 5; +connection node_1b; START TRANSACTION; SET SESSION wsrep_trx_fragment_size = 1; INSERT INTO t1 VALUES (3, 'b'); UPDATE t1 SET f2 = 'b' WHERE f1 = 2; +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1a; UPDATE t1 SET f2 = 'a' WHERE f1 = 2; +connection node_1; +connection node_1b; SET DEBUG_SYNC = 'wsrep_before_SR_rollback SIGNAL wait WAIT_FOR continue'; UPDATE t1 SET f2 = 'b' WHERE f1 = 1; +connection node_1; SET DEBUG_SYNC = 'now WAIT_FOR wait'; +connection node_1; SET DEBUG_SYNC = 'now SIGNAL continue'; +connection node_1c; UPDATE t1 SET f2 = 'x' WHERE f1 = 3; +connection node_1a; COMMIT; +connection node_1b; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +connection node_1; SELECT * FROM t1; f1 f2 1 a @@ -366,6 +512,7 @@ f1 f2 3 x 4 a 5 a +connection node_2; SELECT * FROM t1; f1 f2 1 a @@ -373,39 +520,56 @@ f1 f2 3 x 4 a 5 a +connection node_1; +SET DEBUG_SYNC = 'RESET'; DROP TABLE t1; +connection node_1; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 VARCHAR(1)) ENGINE=InnoDB; INSERT INTO t1 VALUES (1, 'x'), (2, 'x'), (4, 'x'), (5, 'x'); +connection node_1a; START TRANSACTION; UPDATE t1 SET f2 = 'a' WHERE f1 = 1; UPDATE t1 SET f2 = 'a' WHERE f1 = 4; UPDATE t1 SET f2 = 'a' WHERE f1 = 5; +connection node_1b; START TRANSACTION; SET SESSION wsrep_trx_fragment_size = 1; INSERT INTO t1 VALUES (3, 'b'); UPDATE t1 SET f2 = 'b' WHERE f1 = 2; +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1a; UPDATE t1 SET f2 = 'a' WHERE f1 = 2; +connection node_1; +connection node_1b; SET DEBUG_SYNC = 'wsrep_before_SR_rollback SIGNAL wait WAIT_FOR continue'; UPDATE t1 SET f2 = 'b' WHERE f1 = 1; +connection node_1; SET DEBUG_SYNC = 'now WAIT_FOR wait'; +connection node_1; SET DEBUG_SYNC = 'now SIGNAL continue'; +connection node_1c; UPDATE t1 SET f2 = 'x' WHERE f1 = 3; +connection node_1a; COMMIT; +connection node_1b; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +connection node_1; SELECT * FROM t1; f1 f2 1 a @@ -413,6 +577,7 @@ f1 f2 3 x 4 a 5 a +connection node_2; SELECT * FROM t1; f1 f2 1 a @@ -420,39 +585,56 @@ f1 f2 3 x 4 a 5 a +connection node_1; +SET DEBUG_SYNC = 'RESET'; DROP TABLE t1; +connection node_1; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 VARCHAR(1)) ENGINE=InnoDB; INSERT INTO t1 VALUES (1, 'x'), (2, 'x'), (4, 'x'), (5, 'x'); +connection node_1a; START TRANSACTION; UPDATE t1 SET f2 = 'a' WHERE f1 = 1; UPDATE t1 SET f2 = 'a' WHERE f1 = 4; UPDATE t1 SET f2 = 'a' WHERE f1 = 5; +connection node_1b; START TRANSACTION; SET SESSION wsrep_trx_fragment_size = 1; INSERT INTO t1 VALUES (3, 'b'); UPDATE t1 SET f2 = 'b' WHERE f1 = 2; +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1a; UPDATE t1 SET f2 = 'a' WHERE f1 = 2; +connection node_1; +connection node_1b; SET DEBUG_SYNC = 'wsrep_before_SR_rollback SIGNAL wait WAIT_FOR continue'; UPDATE t1 SET f2 = 'b' WHERE f1 = 1; +connection node_1; SET DEBUG_SYNC = 'now WAIT_FOR wait'; +connection node_1; SET DEBUG_SYNC = 'now SIGNAL continue'; +connection node_1c; UPDATE t1 SET f2 = 'x' WHERE f1 = 3; +connection node_1a; COMMIT; +connection node_1b; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +connection node_1; SELECT * FROM t1; f1 f2 1 a @@ -460,6 +642,7 @@ f1 f2 3 x 4 a 5 a +connection node_2; SELECT * FROM t1; f1 f2 1 a @@ -467,39 +650,56 @@ f1 f2 3 x 4 a 5 a +connection node_1; +SET DEBUG_SYNC = 'RESET'; DROP TABLE t1; +connection node_1; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 VARCHAR(1)) ENGINE=InnoDB; INSERT INTO t1 VALUES (1, 'x'), (2, 'x'), (4, 'x'), (5, 'x'); +connection node_1a; START TRANSACTION; UPDATE t1 SET f2 = 'a' WHERE f1 = 1; UPDATE t1 SET f2 = 'a' WHERE f1 = 4; UPDATE t1 SET f2 = 'a' WHERE f1 = 5; +connection node_1b; START TRANSACTION; SET SESSION wsrep_trx_fragment_size = 1; INSERT INTO t1 VALUES (3, 'b'); UPDATE t1 SET f2 = 'b' WHERE f1 = 2; +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1a; UPDATE t1 SET f2 = 'a' WHERE f1 = 2; +connection node_1; +connection node_1b; SET DEBUG_SYNC = 'wsrep_before_SR_rollback SIGNAL wait WAIT_FOR continue'; UPDATE t1 SET f2 = 'b' WHERE f1 = 1; +connection node_1; SET DEBUG_SYNC = 'now WAIT_FOR wait'; +connection node_1; SET DEBUG_SYNC = 'now SIGNAL continue'; +connection node_1c; UPDATE t1 SET f2 = 'x' WHERE f1 = 3; +connection node_1a; COMMIT; +connection node_1b; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +connection node_1; SELECT * FROM t1; f1 f2 1 a @@ -507,6 +707,7 @@ f1 f2 3 x 4 a 5 a +connection node_2; SELECT * FROM t1; f1 f2 1 a @@ -514,39 +715,56 @@ f1 f2 3 x 4 a 5 a +connection node_1; +SET DEBUG_SYNC = 'RESET'; DROP TABLE t1; +connection node_1; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 VARCHAR(1)) ENGINE=InnoDB; INSERT INTO t1 VALUES (1, 'x'), (2, 'x'), (4, 'x'), (5, 'x'); +connection node_1a; START TRANSACTION; UPDATE t1 SET f2 = 'a' WHERE f1 = 1; UPDATE t1 SET f2 = 'a' WHERE f1 = 4; UPDATE t1 SET f2 = 'a' WHERE f1 = 5; +connection node_1b; START TRANSACTION; SET SESSION wsrep_trx_fragment_size = 1; INSERT INTO t1 VALUES (3, 'b'); UPDATE t1 SET f2 = 'b' WHERE f1 = 2; +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1a; UPDATE t1 SET f2 = 'a' WHERE f1 = 2; +connection node_1; +connection node_1b; SET DEBUG_SYNC = 'wsrep_before_SR_rollback SIGNAL wait WAIT_FOR continue'; UPDATE t1 SET f2 = 'b' WHERE f1 = 1; +connection node_1; SET DEBUG_SYNC = 'now WAIT_FOR wait'; +connection node_1; SET DEBUG_SYNC = 'now SIGNAL continue'; +connection node_1c; UPDATE t1 SET f2 = 'x' WHERE f1 = 3; +connection node_1a; COMMIT; +connection node_1b; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +connection node_1; SELECT * FROM t1; f1 f2 1 a @@ -554,6 +772,7 @@ f1 f2 3 x 4 a 5 a +connection node_2; SELECT * FROM t1; f1 f2 1 a @@ -561,39 +780,56 @@ f1 f2 3 x 4 a 5 a +connection node_1; +SET DEBUG_SYNC = 'RESET'; DROP TABLE t1; +connection node_1; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 VARCHAR(1)) ENGINE=InnoDB; INSERT INTO t1 VALUES (1, 'x'), (2, 'x'), (4, 'x'), (5, 'x'); +connection node_1a; START TRANSACTION; UPDATE t1 SET f2 = 'a' WHERE f1 = 1; UPDATE t1 SET f2 = 'a' WHERE f1 = 4; UPDATE t1 SET f2 = 'a' WHERE f1 = 5; +connection node_1b; START TRANSACTION; SET SESSION wsrep_trx_fragment_size = 1; INSERT INTO t1 VALUES (3, 'b'); UPDATE t1 SET f2 = 'b' WHERE f1 = 2; +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1a; UPDATE t1 SET f2 = 'a' WHERE f1 = 2; +connection node_1; +connection node_1b; SET DEBUG_SYNC = 'wsrep_before_SR_rollback SIGNAL wait WAIT_FOR continue'; UPDATE t1 SET f2 = 'b' WHERE f1 = 1; +connection node_1; SET DEBUG_SYNC = 'now WAIT_FOR wait'; +connection node_1; SET DEBUG_SYNC = 'now SIGNAL continue'; +connection node_1c; UPDATE t1 SET f2 = 'x' WHERE f1 = 3; +connection node_1a; COMMIT; +connection node_1b; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +connection node_1; SELECT * FROM t1; f1 f2 1 a @@ -601,6 +837,7 @@ f1 f2 3 x 4 a 5 a +connection node_2; SELECT * FROM t1; f1 f2 1 a @@ -608,39 +845,56 @@ f1 f2 3 x 4 a 5 a +connection node_1; +SET DEBUG_SYNC = 'RESET'; DROP TABLE t1; +connection node_1; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 VARCHAR(1)) ENGINE=InnoDB; INSERT INTO t1 VALUES (1, 'x'), (2, 'x'), (4, 'x'), (5, 'x'); +connection node_1a; START TRANSACTION; UPDATE t1 SET f2 = 'a' WHERE f1 = 1; UPDATE t1 SET f2 = 'a' WHERE f1 = 4; UPDATE t1 SET f2 = 'a' WHERE f1 = 5; +connection node_1b; START TRANSACTION; SET SESSION wsrep_trx_fragment_size = 1; INSERT INTO t1 VALUES (3, 'b'); UPDATE t1 SET f2 = 'b' WHERE f1 = 2; +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1a; UPDATE t1 SET f2 = 'a' WHERE f1 = 2; +connection node_1; +connection node_1b; SET DEBUG_SYNC = 'wsrep_before_SR_rollback SIGNAL wait WAIT_FOR continue'; UPDATE t1 SET f2 = 'b' WHERE f1 = 1; +connection node_1; SET DEBUG_SYNC = 'now WAIT_FOR wait'; +connection node_1; SET DEBUG_SYNC = 'now SIGNAL continue'; +connection node_1c; UPDATE t1 SET f2 = 'x' WHERE f1 = 3; +connection node_1a; COMMIT; +connection node_1b; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +connection node_1; SELECT * FROM t1; f1 f2 1 a @@ -648,6 +902,7 @@ f1 f2 3 x 4 a 5 a +connection node_2; SELECT * FROM t1; f1 f2 1 a @@ -655,39 +910,56 @@ f1 f2 3 x 4 a 5 a +connection node_1; +SET DEBUG_SYNC = 'RESET'; DROP TABLE t1; +connection node_1; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 VARCHAR(1)) ENGINE=InnoDB; INSERT INTO t1 VALUES (1, 'x'), (2, 'x'), (4, 'x'), (5, 'x'); +connection node_1a; START TRANSACTION; UPDATE t1 SET f2 = 'a' WHERE f1 = 1; UPDATE t1 SET f2 = 'a' WHERE f1 = 4; UPDATE t1 SET f2 = 'a' WHERE f1 = 5; +connection node_1b; START TRANSACTION; SET SESSION wsrep_trx_fragment_size = 1; INSERT INTO t1 VALUES (3, 'b'); UPDATE t1 SET f2 = 'b' WHERE f1 = 2; +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1a; UPDATE t1 SET f2 = 'a' WHERE f1 = 2; +connection node_1; +connection node_1b; SET DEBUG_SYNC = 'wsrep_before_SR_rollback SIGNAL wait WAIT_FOR continue'; UPDATE t1 SET f2 = 'b' WHERE f1 = 1; +connection node_1; SET DEBUG_SYNC = 'now WAIT_FOR wait'; +connection node_1; SET DEBUG_SYNC = 'now SIGNAL continue'; +connection node_1c; UPDATE t1 SET f2 = 'x' WHERE f1 = 3; +connection node_1a; COMMIT; +connection node_1b; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +connection node_1; SELECT * FROM t1; f1 f2 1 a @@ -695,6 +967,7 @@ f1 f2 3 x 4 a 5 a +connection node_2; SELECT * FROM t1; f1 f2 1 a @@ -702,39 +975,56 @@ f1 f2 3 x 4 a 5 a +connection node_1; +SET DEBUG_SYNC = 'RESET'; DROP TABLE t1; +connection node_1; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 VARCHAR(1)) ENGINE=InnoDB; INSERT INTO t1 VALUES (1, 'x'), (2, 'x'), (4, 'x'), (5, 'x'); +connection node_1a; START TRANSACTION; UPDATE t1 SET f2 = 'a' WHERE f1 = 1; UPDATE t1 SET f2 = 'a' WHERE f1 = 4; UPDATE t1 SET f2 = 'a' WHERE f1 = 5; +connection node_1b; START TRANSACTION; SET SESSION wsrep_trx_fragment_size = 1; INSERT INTO t1 VALUES (3, 'b'); UPDATE t1 SET f2 = 'b' WHERE f1 = 2; +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_2; SELECT * FROM t1; f1 f2 1 x 2 x 4 x 5 x +connection node_1a; UPDATE t1 SET f2 = 'a' WHERE f1 = 2; +connection node_1; +connection node_1b; SET DEBUG_SYNC = 'wsrep_before_SR_rollback SIGNAL wait WAIT_FOR continue'; UPDATE t1 SET f2 = 'b' WHERE f1 = 1; +connection node_1; SET DEBUG_SYNC = 'now WAIT_FOR wait'; +connection node_1; SET DEBUG_SYNC = 'now SIGNAL continue'; +connection node_1c; UPDATE t1 SET f2 = 'x' WHERE f1 = 3; +connection node_1a; COMMIT; +connection node_1b; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +connection node_1; SELECT * FROM t1; f1 f2 1 a @@ -742,6 +1032,7 @@ f1 f2 3 x 4 a 5 a +connection node_2; SELECT * FROM t1; f1 f2 1 a @@ -749,4 +1040,6 @@ f1 f2 3 x 4 a 5 a +connection node_1; +SET DEBUG_SYNC = 'RESET'; DROP TABLE t1; diff --git a/mysql-test/suite/galera_sr/t/mysql-wsrep-features#165.inc b/mysql-test/suite/galera_sr/t/mysql-wsrep-features#165.inc index 29755ab6c2e..7f13afa3c47 100644 --- a/mysql-test/suite/galera_sr/t/mysql-wsrep-features#165.inc +++ b/mysql-test/suite/galera_sr/t/mysql-wsrep-features#165.inc @@ -53,6 +53,10 @@ SELECT * FROM t1; --connection node_1a --send UPDATE t1 SET f2 = 'a' WHERE f1 = 2 +--connection node_1 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER != 'system user' AND STATE = 'Updating'; +--source include/wait_condition.inc + # Will deadlock --connection node_1b SET DEBUG_SYNC = 'wsrep_before_SR_rollback SIGNAL wait WAIT_FOR continue'; @@ -101,4 +105,5 @@ SELECT * FROM t1; SELECT * FROM t1; --connection node_1 +SET DEBUG_SYNC = 'RESET'; DROP TABLE t1; diff --git a/sql/service_wsrep.cc b/sql/service_wsrep.cc index f4cf49b9b84..6d76cccccee 100644 --- a/sql/service_wsrep.cc +++ b/sql/service_wsrep.cc @@ -145,8 +145,11 @@ extern "C" void wsrep_handle_SR_rollback(THD *bf_thd, victim_thd->wsrep_trx_id(), victim_thd->wsrep_sr().fragments_certified(), wsrep_thd_transaction_state_str(victim_thd)); - if (bf_thd) victim_thd->store_globals(); - if (!bf_thd) + if (bf_thd && bf_thd != victim_thd) + { + victim_thd->store_globals(); + } + else { DEBUG_SYNC(victim_thd, "wsrep_before_SR_rollback"); } @@ -158,7 +161,10 @@ extern "C" void wsrep_handle_SR_rollback(THD *bf_thd, { wsrep_thd_self_abort(victim_thd); } - if (bf_thd) bf_thd->store_globals(); + if (bf_thd && bf_thd != victim_thd) + { + bf_thd->store_globals(); + } } extern "C" my_bool wsrep_thd_bf_abort(const THD *bf_thd, THD *victim_thd, diff --git a/storage/innobase/lock/lock0lock.cc b/storage/innobase/lock/lock0lock.cc index 0433a04e6f8..6f5011558e4 100644 --- a/storage/innobase/lock/lock0lock.cc +++ b/storage/innobase/lock/lock0lock.cc @@ -7084,6 +7084,12 @@ DeadlockChecker::check_and_resolve(const lock_t* lock, trx_t* trx) if (victim_trx != NULL) { print("*** WE ROLL BACK TRANSACTION (2)\n"); +#ifdef WITH_WSREP + if (wsrep_on(trx->mysql_thd)) { + wsrep_handle_SR_rollback(trx->mysql_thd, + victim_trx->mysql_thd); + } +#endif lock_deadlock_found = true; } diff --git a/wsrep-lib b/wsrep-lib -Subproject 0b09871ad5a10a773c4cbad28e681021d8d234b +Subproject ab0e5f5d776f1bb7472a6c7e50c475312e562bf |