mirror of
https://github.com/MariaDB/server.git
synced 2026-05-15 11:27:39 +02:00
MDEV-21153 Replica nodes crash due to indexed virtual columns and FK cascading delete
Fix for MDEV-23033 fixes a problem in replication applying of transactions, which contain cascading foreign key delete for a table, which has indexed virtual column.
This fix adds slave_fk_event_map flag for table, to mark when the prelocking is needed for applying of a transaction.
See commit 608b0ee52e for more details.
However, this fix is targeted for async replication only, Rows_log_event::do_apply_event() has condition to rule out galera replication from the fix domain, and use cases suffering from MDEV-23033 and related MDEV-21153 will fail in galera cluster.
The fix in this commit removes the condition to rule out the setting of slave_fk_event_map flag from galera replication, and makes the fix in MDEV-23033 effective for galera replication as well.
Finally, a mtr test for virtual column support has been added. galera.galera_virtual_column.test has as first test a scenario from MDEV-21153
Reviewed-by: Jan Lindström <jan.lindstrom@mariadb.com>
This commit is contained in:
parent
049811ec3c
commit
7d04ce6a2d
3 changed files with 60 additions and 1 deletions
17
mysql-test/suite/galera/r/galera_virtual_column.result
Normal file
17
mysql-test/suite/galera/r/galera_virtual_column.result
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
connection node_1;
|
||||
CREATE TABLE p (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT) ENGINE = InnoDB;
|
||||
CREATE TABLE c (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, pid INT UNSIGNED, bitmap TINYINT UNSIGNED NOT NULL DEFAULT 0, bitmap5 TINYINT UNSIGNED GENERATED ALWAYS AS (bitmap&(1<<5)) VIRTUAL, FOREIGN KEY (pid) REFERENCES p (id) ON DELETE CASCADE ON UPDATE CASCADE);
|
||||
CREATE INDEX bitmap5 ON c(bitmap5) USING BTREE;
|
||||
INSERT INTO p VALUES(1);
|
||||
INSERT INTO c(pid) VALUES(1);
|
||||
connection node_2;
|
||||
connection node_1;
|
||||
DELETE FROM p WHERE id=1;
|
||||
SELECT * FROM p;
|
||||
id
|
||||
SELECT * FROM c;
|
||||
id pid bitmap bitmap5
|
||||
connection node_2;
|
||||
connection node_1;
|
||||
DROP TABLE c;
|
||||
DROP TABLE p;
|
||||
42
mysql-test/suite/galera/t/galera_virtual_column.test
Normal file
42
mysql-test/suite/galera/t/galera_virtual_column.test
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
#
|
||||
# This test is for testing virtual columnm support in galera cluster
|
||||
#
|
||||
--source include/galera_cluster.inc
|
||||
--source include/have_innodb.inc
|
||||
|
||||
#
|
||||
# test case for verifying that cascaded delete in a table with virtual column does not crash slave node
|
||||
#
|
||||
|
||||
--connection node_1
|
||||
|
||||
CREATE TABLE p (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT) ENGINE = InnoDB;
|
||||
CREATE TABLE c (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, pid INT UNSIGNED, bitmap TINYINT UNSIGNED NOT NULL DEFAULT 0, bitmap5 TINYINT UNSIGNED GENERATED ALWAYS AS (bitmap&(1<<5)) VIRTUAL, FOREIGN KEY (pid) REFERENCES p (id) ON DELETE CASCADE ON UPDATE CASCADE);
|
||||
|
||||
# not sure of this index is needed for the test
|
||||
CREATE INDEX bitmap5 ON c(bitmap5) USING BTREE;
|
||||
|
||||
INSERT INTO p VALUES(1);
|
||||
INSERT INTO c(pid) VALUES(1);
|
||||
|
||||
|
||||
--connection node_2
|
||||
# wait until both INSERTS have arrived in node_2
|
||||
--let $wait_condition = SELECT COUNT(*) = 1 FROM c
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_1
|
||||
# delete from parent table, it will cascade into child table
|
||||
# node_2 might have problem in applying this cascaded delete
|
||||
DELETE FROM p WHERE id=1;
|
||||
|
||||
SELECT * FROM p;
|
||||
SELECT * FROM c;
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT COUNT(*) = 0 FROM c;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_1
|
||||
DROP TABLE c;
|
||||
DROP TABLE p;
|
||||
|
|
@ -11357,7 +11357,7 @@ int Rows_log_event::do_apply_event(rpl_group_info *rgi)
|
|||
tables->trg_event_map= new_trg_event_map;
|
||||
lex->query_tables_last= &tables->next_global;
|
||||
}
|
||||
else if (!WSREP_ON)
|
||||
else
|
||||
{
|
||||
tables->slave_fk_event_map= new_trg_event_map;
|
||||
lex->query_tables_last= &tables->next_global;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue