mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
MDEV-25089 : Assertion `error.len > 0' failed in galera::ReplicatorSMM::handle_apply_error()
Problem is that Galera starts TOI (total order isolation) i.e. it sends query to all nodes. Later it is discovered that used engine or other feature is not supported by Galera. Because TOI is executed parallelly in all nodes appliers could execute given TOI and ignore the error and start inconsistency voting causing node to leave from cluster or we might have a crash as reported. For example SEQUENCE engine does not support GEOMETRY data type causing either inconsistency between nodes (because some errors are ignored on applier) or crash. Fixed my adding new function wsrep_check_support to check can Galera support provided CREATE TABLE/SEQUENCE before TOI is started and if not clear error message is provided to the user. Currently, not supported cases: * CREATE TABLE ... AS SELECT when streaming replication is used * CREATE TABLE ... WITH SYSTEM VERSIONING AS SELECT * CREATE TABLE ... ENGINE=SEQUENCE * CREATE SEQUENCE ... ENGINE!=InnoDB * ALTER TABLE t ... ENGINE!=InnoDB where table t is SEQUENCE Signed-off-by: Julius Goryavsky <julius.goryavsky@mariadb.com>
This commit is contained in:
committed by
Julius Goryavsky
parent
3228c08fa8
commit
daaa16a47f
@@ -14,7 +14,7 @@ c1
|
||||
INSERT INTO t1 VALUES (4),(3),(1),(2);
|
||||
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
|
||||
CREATE TABLE t1 (pk INT PRIMARY KEY, b INT) ENGINE=SEQUENCE;
|
||||
ERROR 42S01: Table 't1' already exists
|
||||
ERROR 42000: This version of MariaDB doesn't yet support 'non-InnoDB sequences in Galera cluster'
|
||||
ALTER TABLE t1 DROP COLUMN c2;
|
||||
ERROR 42000: Can't DROP COLUMN `c2`; check that it exists
|
||||
SELECT get_lock ('test', 1.5);
|
||||
|
12
mysql-test/suite/galera/r/galera_sequence_engine.result
Normal file
12
mysql-test/suite/galera/r/galera_sequence_engine.result
Normal file
@@ -0,0 +1,12 @@
|
||||
connection node_2;
|
||||
connection node_1;
|
||||
SET GLOBAL wsrep_ignore_apply_errors=0;
|
||||
SET SESSION AUTOCOMMIT=0;
|
||||
SET SESSION max_error_count=0;
|
||||
CREATE TABLE t0 (id GEOMETRY,parent_id GEOMETRY)ENGINE=SEQUENCE;
|
||||
ERROR 42000: This version of MariaDB doesn't yet support 'non-InnoDB sequences in Galera cluster'
|
||||
connection node_2;
|
||||
SHOW CREATE TABLE t0;
|
||||
ERROR 42S02: Table 'test.t0' doesn't exist
|
||||
connection node_1;
|
||||
SET GLOBAL wsrep_ignore_apply_errors=DEFAULT;
|
@@ -1,23 +1,8 @@
|
||||
connection node_2;
|
||||
connection node_1;
|
||||
connection node_1;
|
||||
connection node_2;
|
||||
connection node_1;
|
||||
CREATE TABLE t ENGINE=InnoDB WITH SYSTEM VERSIONING AS SELECT 1 AS i;
|
||||
ERROR 42000: This version of MariaDB doesn't yet support 'SYSTEM VERSIONING AS SELECT in Galera cluster'
|
||||
connection node_2;
|
||||
SHOW CREATE TABLE t;
|
||||
Table Create Table
|
||||
t CREATE TABLE `t` (
|
||||
`i` int(1) NOT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
|
||||
SELECT * from t;
|
||||
i
|
||||
1
|
||||
DROP TABLE IF EXISTS t;
|
||||
COMMIT;
|
||||
connection node_2;
|
||||
SET SESSION wsrep_sync_wait=0;
|
||||
Killing server ...
|
||||
Starting server ...
|
||||
connection node_2;
|
||||
call mtr.add_suppression("WSREP: Event .*Write_rows_v1 apply failed:.*");
|
||||
call mtr.add_suppression("SREP: Failed to apply write set: gtid:.*");
|
||||
ERROR 42S02: Table 'test.t' doesn't exist
|
||||
|
@@ -11,7 +11,11 @@ SET SESSION autocommit=0;
|
||||
SELECT * FROM t1 WHERE c1 <=0 ORDER BY c1 DESC;
|
||||
--error ER_LOCK_DEADLOCK
|
||||
INSERT INTO t1 VALUES (4),(3),(1),(2);
|
||||
--error ER_TABLE_EXISTS_ERROR
|
||||
#
|
||||
# This is because support for CREATE TABLE ENGINE=SEQUENCE
|
||||
# is done before we check does table exists already.
|
||||
#
|
||||
--error ER_NOT_SUPPORTED_YET
|
||||
CREATE TABLE t1 (pk INT PRIMARY KEY, b INT) ENGINE=SEQUENCE;
|
||||
--error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t1 DROP COLUMN c2;
|
||||
|
16
mysql-test/suite/galera/t/galera_sequence_engine.test
Normal file
16
mysql-test/suite/galera/t/galera_sequence_engine.test
Normal file
@@ -0,0 +1,16 @@
|
||||
--source include/galera_cluster.inc
|
||||
--source include/have_sequence.inc
|
||||
|
||||
SET GLOBAL wsrep_ignore_apply_errors=0;
|
||||
SET SESSION AUTOCOMMIT=0;
|
||||
SET SESSION max_error_count=0;
|
||||
--error ER_NOT_SUPPORTED_YET
|
||||
CREATE TABLE t0 (id GEOMETRY,parent_id GEOMETRY)ENGINE=SEQUENCE;
|
||||
|
||||
--connection node_2
|
||||
--error ER_NO_SUCH_TABLE
|
||||
SHOW CREATE TABLE t0;
|
||||
|
||||
--connection node_1
|
||||
SET GLOBAL wsrep_ignore_apply_errors=DEFAULT;
|
||||
|
@@ -1,34 +1,15 @@
|
||||
--source include/galera_cluster.inc
|
||||
|
||||
--let $node_1 = node_1
|
||||
--let $node_2 = node_2
|
||||
--source include/auto_increment_offset_save.inc
|
||||
|
||||
--connection node_1
|
||||
#
|
||||
# Below should not cause nodes to be inconsistent (they could if we
|
||||
# allow TOI as some error are ignored on applier
|
||||
#
|
||||
--error ER_NOT_SUPPORTED_YET
|
||||
CREATE TABLE t ENGINE=InnoDB WITH SYSTEM VERSIONING AS SELECT 1 AS i;
|
||||
|
||||
--connection node_2
|
||||
--error ER_NO_SUCH_TABLE
|
||||
SHOW CREATE TABLE t;
|
||||
SELECT * from t;
|
||||
DROP TABLE IF EXISTS t;
|
||||
COMMIT;
|
||||
|
||||
#
|
||||
# Restart node_2, force SST because database is inconsistent compared to node_1
|
||||
#
|
||||
--connection node_2
|
||||
SET SESSION wsrep_sync_wait=0;
|
||||
--source include/kill_galera.inc
|
||||
--remove_file $MYSQLTEST_VARDIR/mysqld.2/data/grastate.dat
|
||||
--echo Starting server ...
|
||||
let $restart_noprint=2;
|
||||
--source include/start_mysqld.inc
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_2
|
||||
call mtr.add_suppression("WSREP: Event .*Write_rows_v1 apply failed:.*");
|
||||
call mtr.add_suppression("SREP: Failed to apply write set: gtid:.*");
|
||||
|
||||
--source include/auto_increment_offset_restore.inc
|
||||
|
Reference in New Issue
Block a user