-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* created tests focusing in multi-master conflicts during cascading foreign key processing * in row0upd.cc, calling wsrep_row_ups_check_foreign_constraints only when running in cluster * in row0ins.cc fixed regression from MW-369, which caused crash with MW-402.test
- Loading branch information
Showing
3 changed files
with
337 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,152 @@ | ||
CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; | ||
CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, f2 INTEGER, | ||
CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1) ON DELETE CASCADE); | ||
INSERT INTO p VALUES (1, 0); | ||
INSERT INTO p VALUES (2, 0); | ||
INSERT INTO c VALUES (1, 1, 0); | ||
SET AUTOCOMMIT=ON; | ||
START TRANSACTION; | ||
UPDATE c SET f2=1 where f1=1; | ||
SET SESSION wsrep_sync_wait = 0; | ||
SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; | ||
DELETE FROM p WHERE f1 = 1; | ||
SET SESSION wsrep_on = 0; | ||
SET SESSION wsrep_on = 1; | ||
SET GLOBAL wsrep_provider_options = 'dbug='; | ||
SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync'; | ||
COMMIT; | ||
SET SESSION wsrep_on = 0; | ||
SET SESSION wsrep_on = 1; | ||
SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; | ||
SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync'; | ||
SET GLOBAL wsrep_provider_options = 'dbug='; | ||
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction | ||
SELECT * FROM p; | ||
f1 f2 | ||
2 0 | ||
SELECT * FROM c; | ||
f1 p_id f2 | ||
DROP TABLE c; | ||
DROP TABLE p; | ||
CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; | ||
CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, f2 INTEGER, | ||
CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1) ON UPDATE CASCADE); | ||
INSERT INTO p VALUES (1, 0); | ||
INSERT INTO p VALUES (2, 0); | ||
INSERT INTO c VALUES (1, 1, 0); | ||
SET AUTOCOMMIT=ON; | ||
START TRANSACTION; | ||
UPDATE c SET f2=2 where f1=1; | ||
SET SESSION wsrep_sync_wait = 0; | ||
SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; | ||
UPDATE p set f1=11 WHERE f1 = 1; | ||
SET SESSION wsrep_on = 0; | ||
SET SESSION wsrep_on = 1; | ||
SET GLOBAL wsrep_provider_options = 'dbug='; | ||
SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync'; | ||
COMMIT; | ||
SET SESSION wsrep_on = 0; | ||
SET SESSION wsrep_on = 1; | ||
SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; | ||
SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync'; | ||
SET GLOBAL wsrep_provider_options = 'dbug='; | ||
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction | ||
SELECT * FROM p; | ||
f1 f2 | ||
2 0 | ||
11 0 | ||
SELECT * FROM c; | ||
f1 p_id f2 | ||
1 11 0 | ||
DROP TABLE c; | ||
DROP TABLE p; | ||
CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; | ||
CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, f2 INTEGER, | ||
CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1) ON UPDATE CASCADE); | ||
INSERT INTO p VALUES (1, 0); | ||
INSERT INTO p VALUES (2, 0); | ||
INSERT INTO c VALUES (1, 1, 0); | ||
SET AUTOCOMMIT=ON; | ||
START TRANSACTION; | ||
UPDATE c SET p_id=2 where f1=1; | ||
SET SESSION wsrep_sync_wait = 0; | ||
SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; | ||
UPDATE p set f1=11 WHERE f1 = 1; | ||
SET SESSION wsrep_on = 0; | ||
SET SESSION wsrep_on = 1; | ||
SET GLOBAL wsrep_provider_options = 'dbug='; | ||
SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync'; | ||
COMMIT; | ||
SET SESSION wsrep_on = 0; | ||
SET SESSION wsrep_on = 1; | ||
SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; | ||
SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync'; | ||
SET GLOBAL wsrep_provider_options = 'dbug='; | ||
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction | ||
SELECT * FROM p; | ||
f1 f2 | ||
2 0 | ||
11 0 | ||
SELECT * FROM c; | ||
f1 p_id f2 | ||
1 11 0 | ||
SET AUTOCOMMIT=ON; | ||
START TRANSACTION; | ||
UPDATE p set f1=21 WHERE f1 = 11; | ||
SET SESSION wsrep_sync_wait = 0; | ||
SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; | ||
UPDATE c SET p_id=2 where f1=1; | ||
SET SESSION wsrep_on = 0; | ||
SET SESSION wsrep_on = 1; | ||
SET GLOBAL wsrep_provider_options = 'dbug='; | ||
SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync'; | ||
COMMIT; | ||
SET SESSION wsrep_on = 0; | ||
SET SESSION wsrep_on = 1; | ||
SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; | ||
SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync'; | ||
SET GLOBAL wsrep_provider_options = 'dbug='; | ||
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction | ||
SELECT * FROM p; | ||
f1 f2 | ||
2 0 | ||
11 0 | ||
SELECT * FROM c; | ||
f1 p_id f2 | ||
1 2 0 | ||
DROP TABLE c; | ||
DROP TABLE p; | ||
CREATE TABLE p1 (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; | ||
CREATE TABLE p2 (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; | ||
CREATE TABLE c (f1 INTEGER PRIMARY KEY, p1_id INTEGER, p2_id INTEGER, f2 INTEGER, | ||
CONSTRAINT fk_1 FOREIGN KEY (p1_id) REFERENCES p1 (f1) ON DELETE CASCADE, | ||
CONSTRAINT fk_2 FOREIGN KEY (p2_id) REFERENCES p2 (f1)); | ||
INSERT INTO p1 VALUES (1, 0); | ||
INSERT INTO p2 VALUES (1, 0); | ||
INSERT INTO c VALUES (1, 1, 1, 0); | ||
SET AUTOCOMMIT=ON; | ||
START TRANSACTION; | ||
UPDATE p2 SET f2=2 where f1=1; | ||
SET SESSION wsrep_sync_wait = 0; | ||
SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; | ||
DELETE FROM p1 WHERE f1 = 1; | ||
SET SESSION wsrep_on = 0; | ||
SET SESSION wsrep_on = 1; | ||
SET GLOBAL wsrep_provider_options = 'dbug='; | ||
SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_enter_sync'; | ||
COMMIT; | ||
SET SESSION wsrep_on = 0; | ||
SET SESSION wsrep_on = 1; | ||
SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; | ||
SET GLOBAL wsrep_provider_options = 'signal=local_monitor_enter_sync'; | ||
SET GLOBAL wsrep_provider_options = 'dbug='; | ||
SELECT * FROM p1; | ||
f1 f2 | ||
SELECT * FROM p2; | ||
f1 f2 | ||
1 2 | ||
SELECT * FROM c; | ||
f1 p1_id p2_id f2 | ||
DROP TABLE c; | ||
DROP TABLE p1; | ||
DROP TABLE p2; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,184 @@ | ||
--source include/galera_cluster.inc | ||
--source include/have_innodb.inc | ||
--source include/have_debug_sync.inc | ||
--source suite/galera/include/galera_have_debug_sync.inc | ||
|
||
# | ||
# we must open connection node_1a here, MW-369.inc will use it later | ||
# | ||
--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 | ||
|
||
# | ||
# cascading delete operation is replicated from node2 | ||
# and this conflicts with an update for child table in node1 | ||
# | ||
# As a result, the update should fail for certification error | ||
# | ||
--connection node_1 | ||
|
||
CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; | ||
CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, f2 INTEGER, | ||
CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1) ON DELETE CASCADE); | ||
|
||
|
||
INSERT INTO p VALUES (1, 0); | ||
INSERT INTO p VALUES (2, 0); | ||
|
||
INSERT INTO c VALUES (1, 1, 0); | ||
|
||
--let $mw_369_parent_query = UPDATE c SET f2=1 where f1=1 | ||
--let $mw_369_child_query = DELETE FROM p WHERE f1 = 1 | ||
|
||
--connection node_1a | ||
--source MW-369.inc | ||
|
||
# Commit fails | ||
--connection node_1 | ||
--error ER_LOCK_DEADLOCK | ||
--reap | ||
|
||
--connection node_2 | ||
SELECT * FROM p; | ||
SELECT * FROM c; | ||
|
||
DROP TABLE c; | ||
DROP TABLE p; | ||
|
||
# | ||
# cascading update operation is replicated from node2 | ||
# and this conflicts with an update for child table in node1 | ||
# | ||
# As a result, the update should fail for certification error | ||
# | ||
--connection node_1 | ||
|
||
CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; | ||
CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, f2 INTEGER, | ||
CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1) ON UPDATE CASCADE); | ||
|
||
|
||
INSERT INTO p VALUES (1, 0); | ||
INSERT INTO p VALUES (2, 0); | ||
|
||
INSERT INTO c VALUES (1, 1, 0); | ||
|
||
--let $mw_369_parent_query = UPDATE c SET f2=2 where f1=1 | ||
--let $mw_369_child_query = UPDATE p set f1=11 WHERE f1 = 1 | ||
|
||
--connection node_1a | ||
--source MW-369.inc | ||
|
||
# Commit fails | ||
--connection node_1 | ||
--error ER_LOCK_DEADLOCK | ||
--reap | ||
|
||
--connection node_2 | ||
SELECT * FROM p; | ||
SELECT * FROM c; | ||
|
||
DROP TABLE c; | ||
DROP TABLE p; | ||
|
||
# | ||
# ON UPDATE CASCADE tests | ||
# Here we update primary key of parent table to cause cascaded update | ||
# on child table | ||
# | ||
# cascading update operation is replicated from node2 | ||
# and this conflicts with an update for child table in node1 | ||
# | ||
# As a result, the update should fail for certification error | ||
# | ||
--connection node_1 | ||
|
||
CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; | ||
CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, f2 INTEGER, | ||
CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1) ON UPDATE CASCADE); | ||
|
||
|
||
INSERT INTO p VALUES (1, 0); | ||
INSERT INTO p VALUES (2, 0); | ||
|
||
INSERT INTO c VALUES (1, 1, 0); | ||
|
||
--let $mw_369_parent_query = UPDATE c SET p_id=2 where f1=1 | ||
--let $mw_369_child_query = UPDATE p set f1=11 WHERE f1 = 1 | ||
|
||
--connection node_1a | ||
--source MW-369.inc | ||
|
||
# Commit fails | ||
--connection node_1 | ||
--error ER_LOCK_DEADLOCK | ||
--reap | ||
|
||
# same as previous, but statements in different order | ||
--connection node_2 | ||
SELECT * FROM p; | ||
SELECT * FROM c; | ||
|
||
--let $mw_369_parent_query = UPDATE p set f1=21 WHERE f1 = 11 | ||
--let $mw_369_child_query = UPDATE c SET p_id=2 where f1=1 | ||
|
||
--connection node_1a | ||
--source MW-369.inc | ||
|
||
# Commit fails | ||
--connection node_1 | ||
--error ER_LOCK_DEADLOCK | ||
--reap | ||
|
||
|
||
--connection node_2 | ||
SELECT * FROM p; | ||
SELECT * FROM c; | ||
|
||
DROP TABLE c; | ||
DROP TABLE p; | ||
|
||
|
||
# | ||
# CASCADE DELETE tests with two parent tables | ||
# Here we cause cascaded operation on child table through | ||
# one parent table and have other operation on the other | ||
# parent table | ||
# | ||
# cascading update operation is replicated from node2 | ||
# but this does not conflict with an update for the other parent table in node1 | ||
# | ||
# As a result, the update on p2 should succeed | ||
# | ||
--connection node_1 | ||
|
||
CREATE TABLE p1 (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; | ||
CREATE TABLE p2 (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; | ||
CREATE TABLE c (f1 INTEGER PRIMARY KEY, p1_id INTEGER, p2_id INTEGER, f2 INTEGER, | ||
CONSTRAINT fk_1 FOREIGN KEY (p1_id) REFERENCES p1 (f1) ON DELETE CASCADE, | ||
CONSTRAINT fk_2 FOREIGN KEY (p2_id) REFERENCES p2 (f1)); | ||
|
||
|
||
INSERT INTO p1 VALUES (1, 0); | ||
INSERT INTO p2 VALUES (1, 0); | ||
|
||
INSERT INTO c VALUES (1, 1, 1, 0); | ||
|
||
--let $mw_369_parent_query = UPDATE p2 SET f2=2 where f1=1 | ||
--let $mw_369_child_query = DELETE FROM p1 WHERE f1 = 1 | ||
|
||
--connection node_1a | ||
--source MW-369.inc | ||
|
||
# Commit succeeds | ||
--connection node_1 | ||
--reap | ||
|
||
# same as previous, but statements in different order | ||
--connection node_2 | ||
SELECT * FROM p1; | ||
SELECT * FROM p2; | ||
SELECT * FROM c; | ||
|
||
DROP TABLE c; | ||
DROP TABLE p1; | ||
DROP TABLE p2; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters