Commit 41fa564c authored by Alexey Yurchenko's avatar Alexey Yurchenko Committed by Jan Lindström

MDEV-17048 Inconsistency voting support (#1373)

* Collect and pass apply error data to provider
 * Rollback failed transaction and continue operation if provider returns
   SUCCESS
 * MTR tests for inconsistency voting
parent 53ee9c6c
...@@ -84,6 +84,8 @@ extern struct wsrep_service_st { ...@@ -84,6 +84,8 @@ extern struct wsrep_service_st {
my_bool (*wsrep_get_debug_func)(); my_bool (*wsrep_get_debug_func)();
void (*wsrep_commit_ordered_func)(MYSQL_THD thd); void (*wsrep_commit_ordered_func)(MYSQL_THD thd);
my_bool (*wsrep_thd_is_applying_func)(const MYSQL_THD thd); my_bool (*wsrep_thd_is_applying_func)(const MYSQL_THD thd);
my_bool (*wsrep_thd_has_ignored_error_func)(const MYSQL_THD thd);
void (*wsrep_thd_set_ignored_error_func)(MYSQL_THD thd, my_bool val);
} *wsrep_service; } *wsrep_service;
#define MYSQL_SERVICE_WSREP_INCLUDED #define MYSQL_SERVICE_WSREP_INCLUDED
...@@ -124,6 +126,8 @@ extern struct wsrep_service_st { ...@@ -124,6 +126,8 @@ extern struct wsrep_service_st {
#define wsrep_get_debug() wsrep_service->wsrep_get_debug_func() #define wsrep_get_debug() wsrep_service->wsrep_get_debug_func()
#define wsrep_commit_ordered(T) wsrep_service->wsrep_commit_ordered_func(T) #define wsrep_commit_ordered(T) wsrep_service->wsrep_commit_ordered_func(T)
#define wsrep_thd_is_applying(T) wsrep_service->wsrep_thd_is_applying_func(T) #define wsrep_thd_is_applying(T) wsrep_service->wsrep_thd_is_applying_func(T)
#define wsrep_thd_has_ignored_error(T) wsrep_service->wsrep_thd_has_ignored_error_func(T)
#define wsrep_thd_set_ignored_error(T,V) wsrep_service->wsrep_thd_set_ignored_error_func(T,V)
#else #else
...@@ -217,5 +221,8 @@ extern "C" my_bool wsrep_get_debug(); ...@@ -217,5 +221,8 @@ extern "C" my_bool wsrep_get_debug();
extern "C" void wsrep_commit_ordered(MYSQL_THD thd); extern "C" void wsrep_commit_ordered(MYSQL_THD thd);
extern "C" my_bool wsrep_thd_is_applying(const MYSQL_THD thd); extern "C" my_bool wsrep_thd_is_applying(const MYSQL_THD thd);
extern "C" my_bool wsrep_thd_has_ignored_error(const MYSQL_THD thd);
extern "C" void wsrep_thd_set_ignored_error(MYSQL_THD thd, my_bool val);
#endif #endif
#endif /* MYSQL_SERVICE_WSREP_INCLUDED */ #endif /* MYSQL_SERVICE_WSREP_INCLUDED */
...@@ -3,16 +3,29 @@ ...@@ -3,16 +3,29 @@
# #
# Description # Description
# ----------- # -----------
# Configure galera cluster with 2 nodes. # Configure galera cluster with $galera_cluster_size (default: 2) nodes.
# #
--let $galera_cluster_size = 2 if (!$galera_cluster_size)
{
# --die ERROR IN TEST: $galera_cluster_size variable must be set
--let $galera_cluster_size = 2
}
--source include/galera_init.inc --source include/galera_init.inc
--source include/have_innodb.inc --source include/have_innodb.inc
--source include/galera_wait_ready.inc --source include/galera_wait_ready.inc
--connection node_2
--source include/galera_wait_ready.inc --let $_galera_node= $galera_cluster_size
--source include/have_innodb.inc
while ($_galera_node != 1)
{
--connection node_$_galera_node
--source include/galera_wait_ready.inc
--source include/have_innodb.inc
--dec $_galera_node
}
--connection node_1 --connection node_1
# Helper script to allow to wait for condition on a node that may become
# non-primary. It attempts to preserve wsrep_sync_wait and wsrep_on session
# variables.
#
# We are forced to restore a global value for the session wsrep_sync_wait
# here because we can not always issue a SELECT query to obtain the original
# value and then restore it
disable_query_log;
SET SESSION wsrep_sync_wait = 8;
let $restore_wsrep_sync_wait = `SELECT @@GLOBAL.wsrep_sync_wait`;
let $restore_wsrep_on = `SELECT @@wsrep_on`;
SET SESSION wsrep_on = OFF;
--source include/wait_condition.inc
if ($restore_wsrep_on == 1)
{
--eval SET SESSION wsrep_on = ON
}
--eval SET SESSION wsrep_sync_wait = $restore_wsrep_sync_wait
enable_query_log;
let $wait_condition = SELECT 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready' AND VARIABLE_VALUE = 'OFF'; let $wait_condition = SELECT 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready' AND VARIABLE_VALUE = 'OFF';
# since this is called until AFTER provider disconnects,we need to allow --source include/wsrep_wait_condition.inc
# queries in non-prim
#
# We are also forced to use a hard-coded value for wsrep_sync_wait here because
# we can not issue a SELECT query to obtain the original value and then restore
# it
disable_query_log;
SET SESSION wsrep_sync_wait = 7;
--let $restore_wsrep_on = `SHOW VARIABLES WHERE Variable_name = 'wsrep_on' AND Value = 'ON'`
SET SESSION wsrep_on = OFF;
--source include/wait_condition.inc
if ($restore_wsrep_on != "")
{
--eval SET SESSION wsrep_on = ON
}
SET SESSION wsrep_sync_wait = 15;
enable_query_log;
# Waits for N members in the cluster
#
# Usage:
# --let $members=1
# --source wsrep_wait_membership.inc
#
let $wait_condition = SELECT VARIABLE_VALUE = $members FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wsrep_wait_condition.inc
--echo Killing server ... --echo Killing server ...
if (!$kill_signal)
{
--let $kill_signal = 9
}
# Write file to make mysql-test-run.pl expect the crash, but don't start it # Write file to make mysql-test-run.pl expect the crash, but don't start it
--let $_server_id= `SELECT @@server_id` --let $_server_id= `SELECT @@server_id`
--let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.$_server_id.expect --let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.$_server_id.expect
...@@ -7,13 +12,15 @@ ...@@ -7,13 +12,15 @@
# Kill the connected server # Kill the connected server
--disable_reconnect --disable_reconnect
--let KILL_SIGNAL_VALUE = $kill_signal
--let KILL_NODE_PIDFILE = `SELECT @@pid_file` --let KILL_NODE_PIDFILE = `SELECT @@pid_file`
--perl --perl
my $kill_sig = $ENV{'KILL_SIGNAL_VALUE'};
my $pid_filename = $ENV{'KILL_NODE_PIDFILE'}; my $pid_filename = $ENV{'KILL_NODE_PIDFILE'};
my $mysqld_pid = `cat $pid_filename`; my $mysqld_pid = `cat $pid_filename`;
chomp($mysqld_pid); chomp($mysqld_pid);
system("kill -9 $mysqld_pid"); system("kill -s $kill_sig $mysqld_pid");
exit(0); exit(0);
EOF EOF
......
connection node_2;
connection node_1;
connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3;
connect node_4, 127.0.0.1, root, , test, $NODE_MYPORT_4;
connection node_1;
SELECT VARIABLE_VALUE AS expect_4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
expect_4
4
CALL mtr.add_suppression("Slave SQL: Error 'Unknown table");
connection node_2;
SELECT VARIABLE_VALUE AS expect_4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
expect_4
4
CALL mtr.add_suppression("Slave SQL: Error 'Unknown table");
connection node_3;
SELECT VARIABLE_VALUE AS expect_4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
expect_4
4
CALL mtr.add_suppression("Slave SQL: Error 'Unknown table");
connection node_4;
SELECT VARIABLE_VALUE AS expect_4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
expect_4
4
CALL mtr.add_suppression("Slave SQL: Error 'Unknown table");
connection node_2;
connection node_1;
connection node_2;
SET SESSION wsrep_on=OFF;
CREATE TABLE test.t1 (f2 INTEGER);
SET SESSION wsrep_on=ON;
CREATE TABLE test.t1 (f1 INTEGER);
ERROR 42S01: Table 't1' already exists
connection node_1;
SHOW CREATE TABLE test.t1;
Table Create Table
t1 CREATE TABLE `t1` (
`f1` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
SHOW STATUS LIKE 'wsrep_cluster_status';
Variable_name Value
wsrep_cluster_status Primary
DROP TABLE test.t1;
connection node_2;
SET SESSION wsrep_sync_wait=0;
SHOW CREATE TABLE test.t1;
Table Create Table
t1 CREATE TABLE `t1` (
`f2` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
SHOW STATUS LIKE 'wsrep_cluster_status';
Variable_name Value
wsrep_cluster_status Disconnected
CREATE TABLE test.t2 (f1 INTEGER);
ERROR 08S01: WSREP has not yet prepared node for application use
SHOW TABLES IN test;
Tables_in_test
t1
Killing server ...
CALL mtr.add_suppression("Inconsistent by consensus.");
CALL mtr.add_suppression("WSREP: Failed to execute TOI action");
CALL mtr.add_suppression("WSREP: TO isolation end failed");
connection node_2; connection node_2;
connection node_1; connection node_1;
connection node_2; connection node_2;
SET GLOBAL wsrep_ignore_apply_errors=0;
SET SESSION wsrep_on=OFF; SET SESSION wsrep_on=OFF;
CREATE TABLE t1 (f1 INTEGER); CREATE TABLE t1 (f1 INTEGER);
connection node_1; connection node_1;
CREATE TABLE t1 (f1 INTEGER); CREATE TABLE t1 (f1 INTEGER);
connection node_2; connection node_2;
SET SESSION wsrep_on=ON;
SELECT COUNT(*) = 0 FROM t1;
COUNT(*) = 0
1
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
...@@ -33,5 +30,7 @@ DELIMITER ; ...@@ -33,5 +30,7 @@ DELIMITER ;
ROLLBACK /* added by mysqlbinlog */; ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/; /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
CALL mtr.add_suppression("Slave SQL: Error 'Table 't1' already exists' on query"); Killing server ...
SET GLOBAL wsrep_ignore_apply_errors = 7;
DROP TABLE t1; DROP TABLE t1;
CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on");
...@@ -7,27 +7,60 @@ SET GLOBAL wsrep_on = OFF; ...@@ -7,27 +7,60 @@ SET GLOBAL wsrep_on = OFF;
CREATE TABLE t1 (f1 INTEGER); CREATE TABLE t1 (f1 INTEGER);
SET GLOBAL wsrep_on = ON; SET GLOBAL wsrep_on = ON;
DROP TABLE t1; DROP TABLE t1;
connection node_2;
SHOW TABLES;
Tables_in_test
connection node_1;
SET GLOBAL wsrep_on = OFF; SET GLOBAL wsrep_on = OFF;
CREATE SCHEMA s1; CREATE SCHEMA s1;
SET GLOBAL wsrep_on = ON; SET GLOBAL wsrep_on = ON;
DROP SCHEMA s1; DROP SCHEMA s1;
connection node_2;
SHOW SCHEMAS;
Database
information_schema
mtr
mysql
performance_schema
test
connection node_1;
CREATE TABLE t1 (f1 INTEGER); CREATE TABLE t1 (f1 INTEGER);
SET GLOBAL wsrep_on = OFF; SET GLOBAL wsrep_on = OFF;
CREATE INDEX idx1 ON t1 (f1); CREATE INDEX idx1 ON t1 (f1);
SET GLOBAL wsrep_on = ON; SET GLOBAL wsrep_on = ON;
DROP INDEX idx1 ON t1; DROP INDEX idx1 ON t1;
connection node_2;
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`f1` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
DROP TABLE t1; DROP TABLE t1;
connection node_1;
CREATE TABLE t1 (f1 INTEGER); CREATE TABLE t1 (f1 INTEGER);
SET GLOBAL wsrep_on = OFF; SET GLOBAL wsrep_on = OFF;
CREATE INDEX idx1 ON t1 (f1); CREATE INDEX idx1 ON t1 (f1);
SET GLOBAL wsrep_on = ON; SET GLOBAL wsrep_on = ON;
ALTER TABLE t1 DROP INDEX idx1; ALTER TABLE t1 DROP INDEX idx1;
connection node_2;
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`f1` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
DROP TABLE t1; DROP TABLE t1;
connection node_1;
CREATE TABLE t1 (f1 INTEGER); CREATE TABLE t1 (f1 INTEGER);
SET GLOBAL wsrep_on = OFF; SET GLOBAL wsrep_on = OFF;
ALTER TABLE t1 ADD COLUMN f2 INTEGER; ALTER TABLE t1 ADD COLUMN f2 INTEGER;
SET GLOBAL wsrep_on = ON; SET GLOBAL wsrep_on = ON;
ALTER TABLE t1 DROP COLUMN f2; ALTER TABLE t1 DROP COLUMN f2;
connection node_2;
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`f1` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
DROP TABLE t1; DROP TABLE t1;
connection node_2; connection node_2;
SET GLOBAL wsrep_ignore_apply_errors = 2; SET GLOBAL wsrep_ignore_apply_errors = 2;
...@@ -37,14 +70,13 @@ SET GLOBAL wsrep_on = OFF; ...@@ -37,14 +70,13 @@ SET GLOBAL wsrep_on = OFF;
INSERT INTO t1 VALUES (1); INSERT INTO t1 VALUES (1);
SET GLOBAL wsrep_on = ON; SET GLOBAL wsrep_on = ON;
DELETE FROM t1 WHERE f1 = 1; DELETE FROM t1 WHERE f1 = 1;
connection node_1; SELECT COUNT(*) AS expect_0 FROM t1;
SELECT COUNT(*) = 0 FROM t1; expect_0
COUNT(*) = 0 0
1
connection node_2; connection node_2;
SELECT COUNT(*) = 0 FROM t1; SELECT COUNT(*) AS expect_0 FROM t1;
COUNT(*) = 0 expect_0
1 0
DROP TABLE t1; DROP TABLE t1;
connection node_1; connection node_1;
CREATE TABLE t1 (f1 INTEGER); CREATE TABLE t1 (f1 INTEGER);
...@@ -57,13 +89,12 @@ INSERT INTO t1 VALUES (3); ...@@ -57,13 +89,12 @@ INSERT INTO t1 VALUES (3);
DELETE FROM t1 WHERE f1 = 1; DELETE FROM t1 WHERE f1 = 1;
DELETE FROM t1 WHERE f1 = 2; DELETE FROM t1 WHERE f1 = 2;
COMMIT; COMMIT;
connection node_1; SELECT COUNT(*) AS expect_1 FROM t1;
SELECT COUNT(*) = 1 FROM t1; expect_1
COUNT(*) = 1
1 1
connection node_2; connection node_2;
SELECT COUNT(*) = 1 FROM t1; SELECT COUNT(*) AS expect_1 FROM t1;
COUNT(*) = 1 expect_1
1 1
DROP TABLE t1; DROP TABLE t1;
connection node_1; connection node_1;
...@@ -75,16 +106,16 @@ DELETE FROM t1 WHERE f1 = 3; ...@@ -75,16 +106,16 @@ DELETE FROM t1 WHERE f1 = 3;
SET SESSION wsrep_on = ON; SET SESSION wsrep_on = ON;
connection node_1; connection node_1;
DELETE FROM t1; DELETE FROM t1;
SELECT COUNT(*) = 0 FROM t1; SELECT COUNT(*) AS expect_0 FROM t1;
COUNT(*) = 0 expect_0
1 0
connection node_2; connection node_2;
SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; SELECT VARIABLE_VALUE expect_Primary FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
VARIABLE_VALUE = 'Primary' expect_Primary
1 Primary
SELECT COUNT(*) = 0 FROM t1; SELECT COUNT(*) AS expect_0 FROM t1;
COUNT(*) = 0 expect_0
1 0
DROP TABLE t1; DROP TABLE t1;
connection node_1; connection node_1;
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB;
...@@ -103,16 +134,16 @@ DELETE FROM t1 WHERE f1 = 4; ...@@ -103,16 +134,16 @@ DELETE FROM t1 WHERE f1 = 4;
DELETE FROM t1 WHERE f1 = 5; DELETE FROM t1 WHERE f1 = 5;
COMMIT; COMMIT;
SET AUTOCOMMIT=ON; SET AUTOCOMMIT=ON;
SELECT COUNT(*) = 0 FROM t1; SELECT COUNT(*) AS expect_0 FROM t1;
COUNT(*) = 0 expect_0
1 0
connection node_2; connection node_2;
SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; SELECT VARIABLE_VALUE expect_Primary FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
VARIABLE_VALUE = 'Primary' expect_Primary
1 Primary
SELECT COUNT(*) = 0 FROM t1; SELECT COUNT(*) AS expect_0 FROM t1;
COUNT(*) = 0 expect_0
1 0
DROP TABLE t1; DROP TABLE t1;
connection node_1; connection node_1;
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB;
...@@ -126,16 +157,16 @@ DELETE FROM t1 WHERE f1 = 3; ...@@ -126,16 +157,16 @@ DELETE FROM t1 WHERE f1 = 3;
SET SESSION wsrep_on = ON; SET SESSION wsrep_on = ON;
connection node_1; connection node_1;
DELETE t1, t2 FROM t1 JOIN t2 WHERE t1.f1 = t2.f1; DELETE t1, t2 FROM t1 JOIN t2 WHERE t1.f1 = t2.f1;
SELECT COUNT(*) = 0 FROM t1; SELECT COUNT(*) expect_0 FROM t1;
COUNT(*) = 0 expect_0
1 0
connection node_2; connection node_2;
SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
VARIABLE_VALUE = 'Primary' VARIABLE_VALUE = 'Primary'
1 1
SELECT COUNT(*) = 0 FROM t1; SELECT COUNT(*) expect_0 FROM t1;
COUNT(*) = 0 expect_0
1 0
DROP TABLE t1,t2; DROP TABLE t1,t2;
connection node_1; connection node_1;
CREATE TABLE parent (id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB; CREATE TABLE parent (id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB;
...@@ -148,22 +179,22 @@ DELETE FROM child WHERE parent_id = 2; ...@@ -148,22 +179,22 @@ DELETE FROM child WHERE parent_id = 2;
SET SESSION wsrep_on = ON; SET SESSION wsrep_on = ON;
connection node_1; connection node_1;
DELETE FROM parent; DELETE FROM parent;
SELECT COUNT(*) = 0 FROM parent; SELECT COUNT(*) AS expect_0 FROM parent;
COUNT(*) = 0 expect_0
1 0
SELECT COUNT(*) = 0 FROM child; SELECT COUNT(*) AS expect_0 FROM child;
COUNT(*) = 0 expect_0
1 0
connection node_2; connection node_2;
SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
VARIABLE_VALUE = 'Primary' VARIABLE_VALUE = 'Primary'
1 1
SELECT COUNT(*) = 0 FROM parent; SELECT COUNT(*) AS expect_0 FROM parent;
COUNT(*) = 0 expect_0
1 0
SELECT COUNT(*) = 0 FROM child; SELECT COUNT(*) AS expect_0 FROM child;
COUNT(*) = 0 expect_0
1 0
DROP TABLE child, parent; DROP TABLE child, parent;
connection node_2; connection node_2;
SET GLOBAL wsrep_ignore_apply_errors = 4; SET GLOBAL wsrep_ignore_apply_errors = 4;
...@@ -175,6 +206,8 @@ connection node_1; ...@@ -175,6 +206,8 @@ connection node_1;
CREATE TABLE t1 (f1 INTEGER, f2 INTEGER); CREATE TABLE t1 (f1 INTEGER, f2 INTEGER);
DROP TABLE t1; DROP TABLE t1;
connection node_2; connection node_2;
SELECT * FROM t1;
ERROR 42S02: Table 'test.t1' doesn't exist
SET GLOBAL wsrep_ignore_apply_errors = 7; SET GLOBAL wsrep_ignore_apply_errors = 7;
CALL mtr.add_suppression("Can't find record in 't.*'"); CALL mtr.add_suppression("Can't find record in 't.*'");
CALL mtr.add_suppression("Slave SQL: Could not execute Delete_rows event"); CALL mtr.add_suppression("Slave SQL: Could not execute Delete_rows event");
......
connection node_2;
connection node_1;
connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3;
connection node_3;
SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1';
connection node_1;
connect node_4, 127.0.0.1, root, , test, $NODE_MYPORT_4;
connection node_4;
SET SESSION wsrep_on=OFF;
CREATE TABLE t1 (f1 INTEGER);
SET SESSION wsrep_on=ON;
DROP TABLE t1;
connection node_1;
CREATE TABLE t2 (f1 INTEGER);
connection node_3;
SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 0';
connection node_1;
connection node_3;
SELECT COUNT(*) AS expect_0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1';
expect_0
0
SELECT COUNT(*) AS expect_1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2';
expect_1
1
connection node_4;
SET SESSION wsrep_on=OFF;
Killing server ...
Starting mysqld
connection node_1;
SELECT COUNT(*) AS expect_0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1';
expect_0
0
SELECT COUNT(*) AS expect_1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2';
expect_1
1
CALL mtr.add_suppression("Slave SQL: Error 'Unknown table");
connection node_2;
SELECT COUNT(*) AS expect_0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1';
expect_0
0
SELECT COUNT(*) AS expect_1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2';
expect_1
1
CALL mtr.add_suppression("Slave SQL: Error 'Unknown table");
connection node_3;
SELECT COUNT(*) AS expect_0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1';
expect_0
0
SELECT COUNT(*) AS expect_1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2';
expect_1
1
connection node_4;
SELECT COUNT(*) AS expect_0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1';
expect_0
0
SELECT COUNT(*) AS expect_1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2';
expect_1
1
CALL mtr.add_suppression("WSREP: Vote 0 \\(success\\) on .* is inconsistent with group. Leaving cluster.");
DROP TABLE t2;
connection node_4;
connection node_3;
connection node_2;
connection node_1;
connection node_1;
connection node_2;
connection node_3;
connection node_4;
connection node_3;
SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1';
connection node_1;
connection node_1;
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(10)) ENGINE=InnoDB;
INSERT INTO t1 VALUES (1, 'A');
connection node_4;
SET SESSION wsrep_on=OFF;
INSERT INTO t1 VALUES (2, 'B');
SET SESSION wsrep_on=ON;
DELETE FROM t1 WHERE f1 = 2;
connection node_1;
connection node_3;
SET SESSION wsrep_on = ON;
SET SESSION wsrep_sync_wait = 15;
SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 0';
connection node_1;
connection node_3;
SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'A';
COUNT(*) = 1
1
SELECT COUNT(*) = 0 FROM t1 WHERE f2 = 'B';
COUNT(*) = 0
1
connection node_4;
SET SESSION wsrep_on=OFF;
Killing server ...
Starting mysqld
connection node_1;
connection node_1;
SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'A';
COUNT(*) = 1
1
SELECT COUNT(*) = 0 FROM t1 WHERE f2 = 'B';
COUNT(*) = 0
1
CALL mtr.add_suppression("mysqld: Can't find record in 't1'");
CALL mtr.add_suppression("Slave SQL: Could not execute Delete_rows");
CALL mtr.add_suppression("WSREP: Event 3 Delete_rows_v1 apply failed: 120, seqno [0-9]*");
connection node_2;
SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'A';
COUNT(*) = 1
1
SELECT COUNT(*) = 0 FROM t1 WHERE f2 = 'B';
COUNT(*) = 0
1
CALL mtr.add_suppression("mysqld: Can't find record in 't1'");
CALL mtr.add_suppression("Slave SQL: Could not execute Delete_rows");
CALL mtr.add_suppression("WSREP: Event 3 Delete_rows_v1 apply failed: 120, seqno [0-9]*");
connection node_3;
SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'A';
COUNT(*) = 1
1
SELECT COUNT(*) = 0 FROM t1 WHERE f2 = 'B';
COUNT(*) = 0
1
connection node_4;
SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'A';
COUNT(*) = 1
1
SELECT COUNT(*) = 0 FROM t1 WHERE f2 = 'B';
COUNT(*) = 0
1
CALL mtr.add_suppression("inconsistent with group");
DROP TABLE t1;
!include ../galera_4nodes.cnf
[mysqld.1]
wsrep_provider_options='base_port=@mysqld.1.#galera_port'
wsrep_ignore_apply_errors=0
[mysqld.2]
wsrep_provider_options='base_port=@mysqld.2.#galera_port'
wsrep_ignore_apply_errors=0
[mysqld.3]
wsrep_provider_options='base_port=@mysqld.3.#galera_port'
wsrep_ignore_apply_errors=0
[mysqld.4]
wsrep_provider_options='base_port=@mysqld.4.#galera_port'
wsrep_ignore_apply_errors=0
#
# GCF-360 Inconsistency voting: node goes non-prim on DDL that fails everywhere
#
# We issue 400 DDLs in total to make this test more stressful#
#
--source include/galera_cluster.inc
--let $count = 100
--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3
--connect node_4, 127.0.0.1, root, , test, $NODE_MYPORT_4
--disable_query_log
--disable_result_log
while ($count)
{
--connection node_1
--send DROP TABLE nonexisting_table;
--connection node_2
--send DROP TABLE nonexisting_table;
--connection node_3
--send DROP TABLE nonexisting_table;
--connection node_4
--send DROP TABLE nonexisting_table;
--connection node_1
--error ER_BAD_TABLE_ERROR
--reap
--connection node_2
--error ER_BAD_TABLE_ERROR
--reap
--connection node_3
--error ER_BAD_TABLE_ERROR
--reap
--connection node_4
--error ER_BAD_TABLE_ERROR
--reap
--dec $count
}
--enable_result_log
--enable_query_log
--connection node_1
SELECT VARIABLE_VALUE AS expect_4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
CALL mtr.add_suppression("Slave SQL: Error 'Unknown table");
--connection node_2
SELECT VARIABLE_VALUE AS expect_4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
CALL mtr.add_suppression("Slave SQL: Error 'Unknown table");
--connection node_3
SELECT VARIABLE_VALUE AS expect_4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
CALL mtr.add_suppression("Slave SQL: Error 'Unknown table");
--connection node_4
SELECT VARIABLE_VALUE AS expect_4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
CALL mtr.add_suppression("Slave SQL: Error 'Unknown table");
!include ../galera_2nodes.cnf
[mysqld]
wsrep-ignore-apply-errors=0
wsrep-sync-wait=0
#
# This test tests voting for DDLs (TOI events)
#
--source include/galera_cluster.inc
--source include/have_innodb.inc
--connection node_2
SET SESSION wsrep_on=OFF;
CREATE TABLE test.t1 (f2 INTEGER);
SET SESSION wsrep_on=ON;
--error ER_TABLE_EXISTS_ERROR
CREATE TABLE test.t1 (f1 INTEGER);
--connection node_1
--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
SHOW CREATE TABLE test.t1;
SHOW STATUS LIKE 'wsrep_cluster_status';
DROP TABLE test.t1;
--connection node_2
SET SESSION wsrep_sync_wait=0;
--let $wait_condition = SELECT VARIABLE_VALUE = 0 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
SHOW CREATE TABLE test.t1;
SHOW STATUS LIKE 'wsrep_cluster_status';
--error ER_UNKNOWN_COM_ERROR
CREATE TABLE test.t2 (f1 INTEGER);
SHOW TABLES IN test;
--source include/kill_galera.inc
--source include/wait_until_disconnected.inc
--source include/start_mysqld.inc
CALL mtr.add_suppression("Inconsistent by consensus.");
CALL mtr.add_suppression("WSREP: Failed to execute TOI action");
CALL mtr.add_suppression("WSREP: TO isolation end failed");
...@@ -7,24 +7,35 @@ ...@@ -7,24 +7,35 @@
--connection node_2 --connection node_2
--exec rm -rf $MYSQLTEST_VARDIR/mysqld.2/data/GRA_*.log --exec rm -rf $MYSQLTEST_VARDIR/mysqld.2/data/GRA_*.log
let $restore_wsrep_ignore_apply_errors = `SELECT @@GLOBAL.wsrep_ignore_apply_errors`;
SET GLOBAL wsrep_ignore_apply_errors=0;
# Create applier failure # Create applier failure
SET SESSION wsrep_on=OFF; SET SESSION wsrep_on=OFF;
CREATE TABLE t1 (f1 INTEGER); CREATE TABLE t1 (f1 INTEGER);
--connection node_1 --connection node_1
CREATE TABLE t1 (f1 INTEGER); CREATE TABLE t1 (f1 INTEGER);
# node 2 should detect an error and leave the cluster
--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
--connection node_2 --connection node_2
SET SESSION wsrep_on=ON; --let $wait_condition = SELECT VARIABLE_VALUE = 0 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
SELECT COUNT(*) = 0 FROM t1; --source include/wait_condition.inc
# Make sure the GRA file produced is readable and contains the failure # Make sure the GRA file produced is readable and contains the failure
--replace_regex /SET TIMESTAMP=[0-9]+/SET TIMESTAMP=<TIMESTAMP>/ /pseudo_thread_id=[0-9]+/pseudo_thread_id=<PSEUDO_THREAD_ID>/ --replace_regex /SET TIMESTAMP=[0-9]+/SET TIMESTAMP=<TIMESTAMP>/ /pseudo_thread_id=[0-9]+/pseudo_thread_id=<PSEUDO_THREAD_ID>/
--exec $MYSQL_BINLOG --short-form $MYSQLTEST_VARDIR/mysqld.2/data/GRA_*.log --exec $MYSQL_BINLOG --short-form $MYSQLTEST_VARDIR/mysqld.2/data/GRA_*.log
CALL mtr.add_suppression("Slave SQL: Error 'Table 't1' already exists' on query"); # restart and reconnect node_2
--source include/kill_galera.inc
--source include/wait_until_disconnected.inc
--source include/start_mysqld.inc
--eval SET GLOBAL wsrep_ignore_apply_errors = $restore_wsrep_ignore_apply_errors
DROP TABLE t1; DROP TABLE t1;
CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on");
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
--source include/galera_cluster.inc --source include/galera_cluster.inc
--source include/have_innodb.inc --source include/have_innodb.inc
# #
# Ignore reconciling DDL errors on node_2 # Ignore reconciling DDL errors on node_2
# #
...@@ -20,34 +19,53 @@ CREATE TABLE t1 (f1 INTEGER); ...@@ -20,34 +19,53 @@ CREATE TABLE t1 (f1 INTEGER);
SET GLOBAL wsrep_on = ON; SET GLOBAL wsrep_on = ON;
DROP TABLE t1; DROP TABLE t1;
--connection node_2
SHOW TABLES;
# Drop schema that does not exist # Drop schema that does not exist
--connection node_1
SET GLOBAL wsrep_on = OFF; SET GLOBAL wsrep_on = OFF;
CREATE SCHEMA s1; CREATE SCHEMA s1;
SET GLOBAL wsrep_on = ON; SET GLOBAL wsrep_on = ON;
DROP SCHEMA s1; DROP SCHEMA s1;
--connection node_2
SHOW SCHEMAS;
# Drop index that does not exist using DROP INDEX # Drop index that does not exist using DROP INDEX
--connection node_1
CREATE TABLE t1 (f1 INTEGER); CREATE TABLE t1 (f1 INTEGER);
SET GLOBAL wsrep_on = OFF; SET GLOBAL wsrep_on = OFF;
CREATE INDEX idx1 ON t1 (f1); CREATE INDEX idx1 ON t1 (f1);
SET GLOBAL wsrep_on = ON; SET GLOBAL wsrep_on = ON;
DROP INDEX idx1 ON t1; DROP INDEX idx1 ON t1;
--connection node_2
SHOW CREATE TABLE t1;
DROP TABLE t1; DROP TABLE t1;
# Drop index that does not exist using ALTER TABLE # Drop index that does not exist using ALTER TABLE
--connection node_1
CREATE TABLE t1 (f1 INTEGER); CREATE TABLE t1 (f1 INTEGER);
SET GLOBAL wsrep_on = OFF; SET GLOBAL wsrep_on = OFF;
CREATE INDEX idx1 ON t1 (f1); CREATE INDEX idx1 ON t1 (f1);
SET GLOBAL wsrep_on = ON; SET GLOBAL wsrep_on = ON;
ALTER TABLE t1 DROP INDEX idx1; ALTER TABLE t1 DROP INDEX idx1;
--connection node_2
SHOW CREATE TABLE t1;
DROP TABLE t1; DROP TABLE t1;
# Drop column that does not exist # Drop column that does not exist
--connection node_1
CREATE TABLE t1 (f1 INTEGER); CREATE TABLE t1 (f1 INTEGER);
SET GLOBAL wsrep_on = OFF; SET GLOBAL wsrep_on = OFF;
ALTER TABLE t1 ADD COLUMN f2 INTEGER; ALTER TABLE t1 ADD COLUMN f2 INTEGER;
SET GLOBAL wsrep_on = ON; SET GLOBAL wsrep_on = ON;
ALTER TABLE t1 DROP COLUMN f2; ALTER TABLE t1 DROP COLUMN f2;
--connection node_2
SHOW CREATE TABLE t1;
DROP TABLE t1; DROP TABLE t1;
...@@ -65,12 +83,10 @@ SET GLOBAL wsrep_on = OFF; ...@@ -65,12 +83,10 @@ SET GLOBAL wsrep_on = OFF;
INSERT INTO t1 VALUES (1); INSERT INTO t1 VALUES (1);
SET GLOBAL wsrep_on = ON; SET GLOBAL wsrep_on = ON;
DELETE FROM t1 WHERE f1 = 1; DELETE FROM t1 WHERE f1 = 1;
SELECT COUNT(*) AS expect_0 FROM t1;
--connection node_1
SELECT COUNT(*) = 0 FROM t1;
--connection node_2 --connection node_2
SELECT COUNT(*) = 0 FROM t1; SELECT COUNT(*) AS expect_0 FROM t1;
DROP TABLE t1; DROP TABLE t1;
# Delete row that does not exist in a multi statement transaction # Delete row that does not exist in a multi statement transaction
...@@ -85,12 +101,10 @@ INSERT INTO t1 VALUES (3); ...@@ -85,12 +101,10 @@ INSERT INTO t1 VALUES (3);
DELETE FROM t1 WHERE f1 = 1; DELETE FROM t1 WHERE f1 = 1;
DELETE FROM t1 WHERE f1 = 2; DELETE FROM t1 WHERE f1 = 2;
COMMIT; COMMIT;
SELECT COUNT(*) AS expect_1 FROM t1;
--connection node_1
SELECT COUNT(*) = 1 FROM t1;
--connection node_2 --connection node_2
SELECT COUNT(*) = 1 FROM t1; SELECT COUNT(*) AS expect_1 FROM t1;
DROP TABLE t1; DROP TABLE t1;
# #
...@@ -107,13 +121,16 @@ INSERT INTO t1 VALUES (1),(2),(3),(4),(5); ...@@ -107,13 +121,16 @@ INSERT INTO t1 VALUES (1),(2),(3),(4),(5);
SET SESSION wsrep_on = OFF; SET SESSION wsrep_on = OFF;
DELETE FROM t1 WHERE f1 = 3; DELETE FROM t1 WHERE f1 = 3;
SET SESSION wsrep_on = ON; SET SESSION wsrep_on = ON;
--connection node_1 --connection node_1
DELETE FROM t1; DELETE FROM t1;
SELECT COUNT(*) AS expect_0 FROM t1;
SELECT COUNT(*) = 0 FROM t1;
--connection node_2 --connection node_2
SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; --let $wait_condition = SELECT COUNT(*) = 0 FROM t1;
SELECT COUNT(*) = 0 FROM t1; --source include/wait_condition.inc
SELECT VARIABLE_VALUE expect_Primary FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
SELECT COUNT(*) AS expect_0 FROM t1;
DROP TABLE t1; DROP TABLE t1;
# #
...@@ -130,8 +147,8 @@ INSERT INTO t1 VALUES (1),(2),(3),(4),(5); ...@@ -130,8 +147,8 @@ INSERT INTO t1 VALUES (1),(2),(3),(4),(5);
SET SESSION wsrep_on = OFF; SET SESSION wsrep_on = OFF;
DELETE FROM t1 WHERE f1 = 3; DELETE FROM t1 WHERE f1 = 3;
SET SESSION wsrep_on = ON; SET SESSION wsrep_on = ON;
--connection node_1
--connection node_1
SET AUTOCOMMIT=OFF; SET AUTOCOMMIT=OFF;
START TRANSACTION; START TRANSACTION;
DELETE FROM t1 WHERE f1 = 1; DELETE FROM t1 WHERE f1 = 1;
...@@ -141,11 +158,13 @@ DELETE FROM t1 WHERE f1 = 4; ...@@ -141,11 +158,13 @@ DELETE FROM t1 WHERE f1 = 4;
DELETE FROM t1 WHERE f1 = 5; DELETE FROM t1 WHERE f1 = 5;
COMMIT; COMMIT;
SET AUTOCOMMIT=ON; SET AUTOCOMMIT=ON;
SELECT COUNT(*) AS expect_0 FROM t1;
SELECT COUNT(*) = 0 FROM t1;
--connection node_2 --connection node_2
SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; --let $wait_condition = SELECT COUNT(*) = 0 FROM t1;
SELECT COUNT(*) = 0 FROM t1; --source include/wait_condition.inc
SELECT VARIABLE_VALUE expect_Primary FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
SELECT COUNT(*) AS expect_0 FROM t1;
DROP TABLE t1; DROP TABLE t1;
# #
...@@ -169,11 +188,13 @@ SET SESSION wsrep_on = ON; ...@@ -169,11 +188,13 @@ SET SESSION wsrep_on = ON;
--connection node_1 --connection node_1
DELETE t1, t2 FROM t1 JOIN t2 WHERE t1.f1 = t2.f1; DELETE t1, t2 FROM t1 JOIN t2 WHERE t1.f1 = t2.f1;
SELECT COUNT(*) = 0 FROM t1; SELECT COUNT(*) expect_0 FROM t1;
--connection node_2 --connection node_2
--let $wait_condition = SELECT COUNT(*) = 0 FROM t1;
--source include/wait_condition.inc
SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
SELECT COUNT(*) = 0 FROM t1; SELECT COUNT(*) expect_0 FROM t1;
DROP TABLE t1,t2; DROP TABLE t1,t2;
# #
...@@ -196,13 +217,15 @@ SET SESSION wsrep_on = ON; ...@@ -196,13 +217,15 @@ SET SESSION wsrep_on = ON;
--connection node_1 --connection node_1
DELETE FROM parent; DELETE FROM parent;
SELECT COUNT(*) = 0 FROM parent; SELECT COUNT(*) AS expect_0 FROM parent;
SELECT COUNT(*) = 0 FROM child; SELECT COUNT(*) AS expect_0 FROM child;
--connection node_2 --connection node_2
--let $wait_condition = SELECT COUNT(*) = 0 FROM child;
--source include/wait_condition.inc
SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
SELECT COUNT(*) = 0 FROM parent; SELECT COUNT(*) AS expect_0 FROM parent;
SELECT COUNT(*) = 0 FROM child; SELECT COUNT(*) AS expect_0 FROM child;
DROP TABLE child, parent; DROP TABLE child, parent;
# #
...@@ -217,12 +240,14 @@ SET GLOBAL wsrep_ignore_apply_errors = 4; ...@@ -217,12 +240,14 @@ SET GLOBAL wsrep_ignore_apply_errors = 4;
SET GLOBAL wsrep_on = OFF; SET GLOBAL wsrep_on = OFF;
CREATE TABLE t1 (f1 INTEGER); CREATE TABLE t1 (f1 INTEGER);
SET GLOBAL wsrep_on = ON; SET GLOBAL wsrep_on = ON;
--connection node_1 --connection node_1
CREATE TABLE t1 (f1 INTEGER, f2 INTEGER); CREATE TABLE t1 (f1 INTEGER, f2 INTEGER);
DROP TABLE t1; DROP TABLE t1;
--connection node_2 --connection node_2
--error ER_NO_SUCH_TABLE
SELECT * FROM t1;
SET GLOBAL wsrep_ignore_apply_errors = 7; SET GLOBAL wsrep_ignore_apply_errors = 7;
CALL mtr.add_suppression("Can't find record in 't.*'"); CALL mtr.add_suppression("Can't find record in 't.*'");
......
!include ../galera_4nodes.cnf
[mysqld]
wsrep-ignore-apply-errors=0
#
# Test the case where a node that dropped prior to an inconsistency vote is
# able to rejoin via IST after the vote is complete
#
--source include/galera_cluster.inc
--source include/big_test.inc
# Isolate node #3
--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3
--connection node_3
SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1';
# Wait for node #3 to leave cluster
--connection node_1
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
# Introduce inconsistency on node #4
--connect node_4, 127.0.0.1, root, , test, $NODE_MYPORT_4
--connection node_4
SET SESSION wsrep_on=OFF;
CREATE TABLE t1 (f1 INTEGER);
SET SESSION wsrep_on=ON;
DROP TABLE t1;
# Wait for node #4 to be voted out
--connection node_1
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
# Do some more stuff on the cluster to add to the IST stream
CREATE TABLE t2 (f1 INTEGER);
# Rejoin node #3
--connection node_3
SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 0';
--source include/galera_wait_ready.inc
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
--connection node_1
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
# Confirm that all is good
--connection node_3
SELECT COUNT(*) AS expect_0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1';
SELECT COUNT(*) AS expect_1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2';
# Rejoin node #4
--connection node_4
SET SESSION wsrep_on=OFF;
--source include/kill_galera.inc
--sleep 1
--echo Starting mysqld
--source include/start_mysqld.inc
--connection node_1
# Confirm node #4 has rejoined
--let $wait_condition = SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
# Confirm that all is good and all nodes have identical data
SELECT COUNT(*) AS expect_0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1';
SELECT COUNT(*) AS expect_1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2';
CALL mtr.add_suppression("Slave SQL: Error 'Unknown table");
--connection node_2
SELECT COUNT(*) AS expect_0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1';
SELECT COUNT(*) AS expect_1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2';
CALL mtr.add_suppression("Slave SQL: Error 'Unknown table");
--connection node_3
SELECT COUNT(*) AS expect_0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1';
SELECT COUNT(*) AS expect_1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2';
--connection node_4
SELECT COUNT(*) AS expect_0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1';
SELECT COUNT(*) AS expect_1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2';
CALL mtr.add_suppression("WSREP: Vote 0 \\(success\\) on .* is inconsistent with group. Leaving cluster.");
DROP TABLE t2;
!include ../galera_4nodes.cnf
[mysqld]
wsrep-ignore-apply-errors=0
[ENV]
galera_cluster_size=4
#
# Test the case where a node that dropped prior to an inconsistency vote is
# able to rejoin via IST after the vote is complete
#
--source include/galera_cluster.inc
--source include/big_test.inc
--let $node_1=node_1
--let $node_2=node_2
--let $node_3=node_3
--let $node_4=node_4
--source include/auto_increment_offset_save.inc
# Isolate node #3
--connection node_3
SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1';
# Wait for node #3 to leave cluster
--connection node_1
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
--connection node_1
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(10)) ENGINE=InnoDB;
INSERT INTO t1 VALUES (1, 'A');
# Introduce inconsistency on node #4
--connection node_4
SET SESSION wsrep_on=OFF;
INSERT INTO t1 VALUES (2, 'B');
SET SESSION wsrep_on=ON;
DELETE FROM t1 WHERE f1 = 2;
# Wait for node #4 to be voted out
--connection node_1
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
# Rejoin node #3
--connection node_3
--source include/wsrep_wait_disconnect.inc
SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 0';
--source include/galera_wait_ready.inc
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
--connection node_1
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
# Confirm that all is good
--connection node_3
SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'A';
SELECT COUNT(*) = 0 FROM t1 WHERE f2 = 'B';
# Rejoin node #4
--connection node_4
SET SESSION wsrep_on=OFF;
--source include/kill_galera.inc
--sleep 1
--echo Starting mysqld
--source include/start_mysqld.inc
# Confirm node #4 has rejoined
--connection node_1
--let $wait_condition = SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
# Confirm that all is good and all nodes have identical data
--connection node_1
SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'A';
SELECT COUNT(*) = 0 FROM t1 WHERE f2 = 'B';
CALL mtr.add_suppression("mysqld: Can't find record in 't1'");
CALL mtr.add_suppression("Slave SQL: Could not execute Delete_rows");
CALL mtr.add_suppression("WSREP: Event 3 Delete_rows_v1 apply failed: 120, seqno [0-9]*");
--connection node_2
SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'A';
SELECT COUNT(*) = 0 FROM t1 WHERE f2 = 'B';
CALL mtr.add_suppression("mysqld: Can't find record in 't1'");
CALL mtr.add_suppression("Slave SQL: Could not execute Delete_rows");
CALL mtr.add_suppression("WSREP: Event 3 Delete_rows_v1 apply failed: 120, seqno [0-9]*");
--connection node_3
SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'A';
SELECT COUNT(*) = 0 FROM t1 WHERE f2 = 'B';
--connection node_4
--source include/galera_wait_ready.inc
SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'A';
SELECT COUNT(*) = 0 FROM t1 WHERE f2 = 'B';
CALL mtr.add_suppression("inconsistent with group");
DROP TABLE t1;
--source include/auto_increment_offset_restore.inc
connection node_2;
connection node_1;
connection node_2;
SET wsrep_on=OFF;
DROP SCHEMA test;
connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3;
connection node_3;
SET wsrep_on=OFF;
CREATE TABLE test.t1 (f1 INTEGER);
connection node_1;
CREATE TABLE test.t1 (f1 INTEGER);
SHOW STATUS LIKE 'wsrep_cluster_status';
Variable_name Value
wsrep_cluster_status Primary
DROP TABLE test.t1;
connection node_2;
SET SESSION wsrep_sync_wait=0;
SHOW STATUS LIKE 'wsrep_cluster_status';
Variable_name Value
wsrep_cluster_status Disconnected
disconnect node_2;
connect node_2, 127.0.0.1, root, , mysql, $NODE_MYPORT_2;
Killing server ...
connection node_2;
Starting node_2
# restart
connection node_3;
SET SESSION wsrep_sync_wait=0;
SHOW STATUS LIKE 'wsrep_cluster_status';
Variable_name Value
wsrep_cluster_status Disconnected
disconnect node_3;
connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3;
Killing server ...
connection node_3;
Starting node_3
# restart
connection node_1;
Nodes 2 and 3 started
connection node_2;
USE test;
Node 2 synced
CALL mtr.add_suppression("Slave SQL: Error 'Unknown database 'test'' on query. Default database: 'test'. Query: 'CREATE TABLE test.t1 \\\(f1 INTEGER\\\)', Error_code: 1049");
CALL mtr.add_suppression("Query apply failed");
CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on .*");
CALL mtr.add_suppression("Plugin 'InnoDB' will be forced to shutdown");
connection node_3;
Node 3 synced
CALL mtr.add_suppression("Slave SQL: Error 'Table 't1' already exists' on query. Default database: 'test'. Query: 'CREATE TABLE test.t1 \\\(f1 INTEGER\\\)', Error_code: 1050");
CALL mtr.add_suppression("Query apply failed");
CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on .*");
CALL mtr.add_suppression("Plugin 'InnoDB' will be forced to shutdown");
connection node_2;
connection node_1;
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)) ENGINE=InnoDB;
connection node_1;
SET GLOBAL wsrep_on=OFF;
INSERT INTO t1 VALUES (1, 'a');
SET GLOBAL wsrep_on=ON;
connection node_2;
SET GLOBAL wsrep_on=OFF;
INSERT INTO t1 VALUES (1, 'a');
SET GLOBAL wsrep_on=ON;
connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3;
connection node_3;
INSERT INTO t1 VALUES (1, 'b');
SET SESSION wsrep_sync_wait = 0;
SHOW STATUS LIKE 'wsrep_cluster_status';
Variable_name Value
wsrep_cluster_status Disconnected
connection node_1;
connection node_3;
SET SESSION wsrep_on=OFF;
# restart
SET SESSION wsrep_on=ON;
connection node_1;
SELECT * FROM t1;
f1 f2
1 a
connection node_2;
SELECT * FROM t1;
f1 f2
1 a
connection node_3;
SELECT * FROM t1;
f1 f2
1 a
DROP TABLE t1;
connection node_1;
CALL mtr.add_suppression("Slave SQL: Could not execute Write_rows event on table test.t1; Duplicate entry '1' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log FIRST, end_log_pos 155, Error_code: 1062");
CALL mtr.add_suppression("WSREP: Event 3 Write_rows_v1 apply failed: 121, seqno ");
connection node_2;
CALL mtr.add_suppression("Slave SQL: Could not execute Write_rows event on table test.t1; Duplicate entry '1' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log FIRST, end_log_pos 155, Error_code: 1062");
CALL mtr.add_suppression("WSREP: Event 3 Write_rows_v1 apply failed: 121, seqno ");
connection node_3;
CALL mtr.add_suppression("WSREP: Vote 0 \\\(success\\\) on (.*) is inconsistent with group. Leaving cluster.");
CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on ");
CALL mtr.add_suppression("Plugin 'InnoDB' will be forced to shutdown");
connection node_2;
connection node_1;
connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3;
connection node_1;
connection node_1;
connection node_2;
connection node_3;
CREATE TABLE test.t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)) ENGINE=InnoDB;
connection node_2;
SET GLOBAL wsrep_on=OFF;
INSERT INTO t1 VALUES (1, 'a');
SET GLOBAL wsrep_on=ON;
LOCK TABLE t1 WRITE;
connection node_1;
INSERT INTO t1 VALUES (1, 'b');
SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1';
SET SESSION wsrep_sync_wait=0;
connection node_3;
connection node_2;
UNLOCK TABLES;
SET SESSION wsrep_on = ON;
SET SESSION wsrep_sync_wait = 15;
connection node_1;
SHOW STATUS LIKE 'wsrep_cluster_status';
Variable_name Value
wsrep_cluster_status non-Primary
connection node_2;
SET SESSION wsrep_sync_wait=0;
SHOW STATUS LIKE 'wsrep_cluster_status';
Variable_name Value
wsrep_cluster_status Disconnected
SHOW STATUS LIKE 'wsrep_cluster_size';
Variable_name Value
wsrep_cluster_size 0
SET GLOBAL wsrep_on=OFF;
SELECT * FROM t1;
f1 f2
1 a
connection node_3;
SET SESSION wsrep_sync_wait=0;
SHOW STATUS LIKE 'wsrep_cluster_status';
Variable_name Value
wsrep_cluster_status Primary
SHOW STATUS LIKE 'wsrep_cluster_size';
Variable_name Value
wsrep_cluster_size 1
SELECT * FROM t1;
f1 f2
1 b
connection node_1;
SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0';
connection node_2;
# restart
connection node_1;
SELECT * FROM t1;
f1 f2
1 b
connection node_2;
SELECT * FROM t1;
f1 f2
1 b
connection node_3;
SELECT * FROM t1;
f1 f2
1 b
DROP TABLE t1;
connection node_2;
CALL mtr.add_suppression("Slave SQL: Could not execute Write_rows event on table test.t1; Duplicate entry '1' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log FIRST, end_log_pos (.*), Error_code: 1062");
CALL mtr.add_suppression("WSREP: Event (.*) Write_rows_v1 apply failed: 121, seqno ");
CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on (.*)");
CALL mtr.add_suppression("Plugin 'InnoDB' will be forced to shutdown");
connection node_2;
connection node_1;
connection node_1;
connection node_2;
connection node_3;
CREATE TABLE test.t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB;
connection node_2;
SET wsrep_on=OFF;
INSERT INTO t1 VALUES (1);
LOCK TABLE t1 WRITE;
SET GLOBAL wsrep_sync_wait=0;
connection node_1;
INSERT INTO t1 VALUES (1);
SET GLOBAL wsrep_sync_wait=0;
SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1';
connection node_3;
connection node_2;
UNLOCK TABLES;
connection node_3;
connection node_1;
SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0';
SET GLOBAL wsrep_sync_wait=15;
DROP TABLE test.t1;
connection node_2;
Killing server ...
# restart
connection node_2;
CALL mtr.add_suppression("Inconsistent by consensus.");
CALL mtr.add_suppression("Slave SQL: Could not execute Write_rows event on table test.t1; Duplicate entry '1' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log FIRST");
CALL mtr.add_suppression("WSREP: Event 3 Write_rows_v1 apply failed: 121, seqno");
CALL mtr.add_suppression("WSREP: Failed to apply trx: source: ");
CALL mtr.add_suppression("WSREP: Failed to apply app buffer: seqno:");
CALL mtr.add_suppression("WSREP: Node consistency compromized, leaving cluster...");
...@@ -8,6 +8,7 @@ SET GLOBAL wsrep_provider_options = 'evs.inactive_timeout=PT100M; evs.suspect_ti ...@@ -8,6 +8,7 @@ SET GLOBAL wsrep_provider_options = 'evs.inactive_timeout=PT100M; evs.suspect_ti
connection node_2; connection node_2;
SET GLOBAL wsrep_provider_options = 'evs.inactive_timeout=PT100M; evs.suspect_timeout=PT1S'; SET GLOBAL wsrep_provider_options = 'evs.inactive_timeout=PT100M; evs.suspect_timeout=PT1S';
connection node_3; connection node_3;
connection node_3;
Suspending node ... Suspending node ...
connection node_1; connection node_1;
SET SESSION wsrep_sync_wait=0; SET SESSION wsrep_sync_wait=0;
......
...@@ -5,9 +5,9 @@ SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_N ...@@ -5,9 +5,9 @@ SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_N
VARIABLE_VALUE = 3 VARIABLE_VALUE = 3
1 1
SET GLOBAL wsrep_provider_options = 'pc.weight=3'; SET GLOBAL wsrep_provider_options = 'pc.weight=3';
SELECT VARIABLE_VALUE = 5 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight'; SELECT VARIABLE_VALUE AS expect_5 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight';
VARIABLE_VALUE = 5 expect_5
1 5
SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1'; SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1';
connection node_2; connection node_2;
SET SESSION wsrep_sync_wait=0; SET SESSION wsrep_sync_wait=0;
...@@ -60,106 +60,104 @@ SHOW STATUS LIKE 'wsrep_local_state_comment'; ...@@ -60,106 +60,104 @@ SHOW STATUS LIKE 'wsrep_local_state_comment';
Variable_name Value Variable_name Value
wsrep_local_state_comment Initialized wsrep_local_state_comment Initialized
connection node_1; connection node_1;
SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight'; SELECT VARIABLE_VALUE AS expect_3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight';
VARIABLE_VALUE = 3 expect_3
1 3
SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; SELECT VARIABLE_VALUE AS expect_Primary FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
VARIABLE_VALUE = 'Primary' expect_Primary
1 Primary
SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected'; SELECT VARIABLE_VALUE AS expect_ON FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected';
VARIABLE_VALUE = 'ON' expect_ON
1 ON
SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; SELECT VARIABLE_VALUE AS expect_ON FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
VARIABLE_VALUE = 'ON' expect_ON
1 ON
SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state'; SELECT VARIABLE_VALUE AS expect_4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state';
VARIABLE_VALUE = 4 expect_4
1 4
SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; SELECT VARIABLE_VALUE AS expect_Synced FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
VARIABLE_VALUE = 'Synced' expect_Synced
1 Synced
SET GLOBAL wsrep_provider_options = 'pc.weight=1'; SET GLOBAL wsrep_provider_options = 'pc.weight=1';
SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight'; SELECT VARIABLE_VALUE AS expect_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight';
VARIABLE_VALUE = 1 expect_1
1 1
connection node_1; connection node_1;
SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0'; SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0';
connection node_2; connection node_2;
connection node_3; connection node_3;
connection node_1; SELECT VARIABLE_VALUE AS expect_3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; expect_3
VARIABLE_VALUE = 3 3
1 SELECT VARIABLE_VALUE AS expect_3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight';
SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight'; expect_3
VARIABLE_VALUE = 3 3
1 SELECT VARIABLE_VALUE AS expect_Primary FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; expect_Primary
VARIABLE_VALUE = 'Primary' Primary
1 SELECT VARIABLE_VALUE AS expect_ON FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected';
SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected'; expect_ON
VARIABLE_VALUE = 'ON' ON
1 SELECT VARIABLE_VALUE AS expect_ON FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; expect_ON
VARIABLE_VALUE = 'ON' ON
1 SELECT VARIABLE_VALUE AS expect_4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state';
SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state'; expect_4
VARIABLE_VALUE = 4 4
1 SELECT VARIABLE_VALUE AS expect_Synced FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; expect_Synced
VARIABLE_VALUE = 'Synced' Synced
1
connection node_2; connection node_2;
SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; SELECT VARIABLE_VALUE AS expect_3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
VARIABLE_VALUE = 3 expect_3
1 3
SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight'; SELECT VARIABLE_VALUE AS expect_3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight';
VARIABLE_VALUE = 3 expect_3
1 3
SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; SELECT VARIABLE_VALUE AS expect_Primary FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
VARIABLE_VALUE = 'Primary' expect_Primary
1 Primary
SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected'; SELECT VARIABLE_VALUE AS expect_ON FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected';
VARIABLE_VALUE = 'ON' expect_ON
1 ON
SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; SELECT VARIABLE_VALUE AS expect_ON FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
VARIABLE_VALUE = 'ON' expect_ON
1 ON
SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state'; SELECT VARIABLE_VALUE AS expect_4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state';
VARIABLE_VALUE = 4 expect_4
1 4
SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; SELECT VARIABLE_VALUE AS expect_Synced FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
VARIABLE_VALUE = 'Synced' expect_Synced
1 Synced
connection node_3;
SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
VARIABLE_VALUE = 3
1
SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight';
VARIABLE_VALUE = 3
1
SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
VARIABLE_VALUE = 'Primary'
1
SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected';
VARIABLE_VALUE = 'ON'
1
SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
VARIABLE_VALUE = 'ON'
1
SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state';
VARIABLE_VALUE = 4
1
SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
VARIABLE_VALUE = 'Synced'
1
connection node_1; connection node_1;
SELECT VARIABLE_VALUE AS expect_3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
expect_3
3
SELECT VARIABLE_VALUE AS expect_3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight';
expect_3
3
SELECT VARIABLE_VALUE AS expect_Primary FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
expect_Primary
Primary
SELECT VARIABLE_VALUE AS expect_ON FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected';
expect_ON
ON
SELECT VARIABLE_VALUE AS expect_ON FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
expect_ON
ON
SELECT VARIABLE_VALUE AS expect_4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state';
expect_4
4
SELECT VARIABLE_VALUE AS expect_Synced FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
expect_Synced
Synced
SET GLOBAL wsrep_provider_options = 'pc.weight=1'; SET GLOBAL wsrep_provider_options = 'pc.weight=1';
CALL mtr.add_suppression('WSREP: gcs_caused\\(\\) returned -1'); CALL mtr.add_suppression('WSREP: gcs_caused\\(\\) returned -1');
connection node_2; connection node_2;
CALL mtr.add_suppression('overriding reported weight for');
CALL mtr.add_suppression('SYNC message from member'); CALL mtr.add_suppression('SYNC message from member');
CALL mtr.add_suppression('user message in state LEAVING'); CALL mtr.add_suppression('user message in state LEAVING');
CALL mtr.add_suppression('sending install message failed: (Transport endpoint is not connected|Socket is not connected)'); CALL mtr.add_suppression('sending install message failed: (Transport endpoint is not connected|Socket is not connected)');
CALL mtr.add_suppression('overriding reported weight for');
connection node_3; connection node_3;
CALL mtr.add_suppression('WSREP: user message in state LEAVING'); CALL mtr.add_suppression('WSREP: user message in state LEAVING');
CALL mtr.add_suppression('sending install message failed: (Transport endpoint is not connected|Socket is not connected)'); CALL mtr.add_suppression('sending install message failed: (Transport endpoint is not connected|Socket is not connected)');
......
connection node_2;
connection node_1;
connection node_1;
connection node_2;
connection node_3;
connection node_3;
SET SESSION wsrep_on=OFF;
DROP SCHEMA test;
connection node_1;
CREATE SCHEMA test;
ERROR HY000: Can't create database 'test'; database exists
connection node_1;
SET SESSION wsrep_sync_wait=0;
connection node_2;
SET SESSION wsrep_sync_wait=0;
connection node_3;
SET SESSION wsrep_sync_wait=0;
disconnect node_3;
connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3;
Killing server ...
# restart
CALL mtr.add_suppression("WSREP: Vote 0 \\\(success\\\) on (.*) is inconsistent with group. Leaving cluster.");
connection node_2;
connection node_1;
Setting SST method to mysqldump ...
call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to '127.0.0.1'");
call mtr.add_suppression("Failed to load slave replication state from table mysql.gtid_slave_pos");
connection node_1;
CREATE USER 'sst';
GRANT ALL PRIVILEGES ON *.* TO 'sst';
SET GLOBAL wsrep_sst_auth = 'sst:';
connection node_2;
SET GLOBAL wsrep_sst_method = 'mysqldump';
connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3;
connection node_1;
connection node_2;
connection node_3;
connection node_1;
CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB;
connection node_2;
SET SESSION wsrep_on=OFF;
ALTER TABLE t1 ADD PRIMARY KEY (f1);
SET SESSION wsrep_on=ON;
connection node_1;
ALTER TABLE t1 LOCK=SHARED, DROP PRIMARY KEY;
ERROR 42000: Can't DROP INDEX `PRIMARY`; check that it exists
connection node_1;
SELECT VARIABLE_VALUE AS expect_Primary FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
expect_Primary
Primary
connection node_3;
SELECT VARIABLE_VALUE AS expect_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
expect_2
2
SELECT VARIABLE_VALUE AS expect_Primary FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
expect_Primary
Primary
connection node_2;
SET SESSION wsrep_on=OFF;
SELECT VARIABLE_VALUE AS expect_Disconnected FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
expect_Disconnected
Disconnected
SET SESSION wsrep_on=ON;
SELECT VARIABLE_VALUE AS expect_Primary FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
expect_Primary
Primary
connection node_1;
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`f1` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
connection node_2;
SET SESSION wsrep_on=OFF;
SET SESSION wsrep_on=ON;
# restart
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`f1` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
SELECT COUNT(*) AS expect_0 FROM t1;
expect_0
0
CALL mtr.add_suppression("is inconsistent with group");
connection node_3;
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`f1` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
DROP TABLE t1;
CALL mtr.add_suppression("Slave SQL: Error 'Can't DROP 'PRIMARY'; check that column/key exists'");
connection node_1;
connection node_1;
CALL mtr.add_suppression("Slave SQL: Error 'The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement' on query");
DROP USER sst;
connection node_2;
CALL mtr.add_suppression("Slave SQL: Error 'The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement' on query");
CALL mtr.add_suppression("InnoDB: Error: Table \"mysql\"\\.\"innodb_index_stats\" not found");
CALL mtr.add_suppression("Can't open and lock time zone table");
CALL mtr.add_suppression("Can't open and lock privilege tables");
CALL mtr.add_suppression("Info table is not ready to be used");
CALL mtr.add_suppression("Native table .* has the wrong structure");
CALL mtr.add_suppression("Table \'mysql.gtid_slave_pos\' doesn\'t exist");
connection node_3;
connection node_2;
connection node_1;
connection node_1;
connection node_2;
connection node_3;
connection node_2;
SELECT @@wsrep_slave_threads = 8;
@@wsrep_slave_threads = 8
1
connection node_1;
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 INT);
INSERT INTO t1 VALUES (1, 0),(2, 0),(3, 0),(4, 0),(5, 0),(6, 0),(7, 0),(8, 0);
connection node_2;
SET GLOBAL wsrep_provider_options='gcs.fc_limit=1K';
SET wsrep_on=OFF;
DELETE FROM t1 WHERE f1 = 2;
DELETE FROM t1 WHERE f1 = 4;
SET wsrep_on=ON;
LOCK TABLES t1 WRITE;
connection node_1;
UPDATE t1 SET f2 = 1 WHERE f1 = 1;
UPDATE t1 SET f2 = 1 WHERE f1 = 2;
UPDATE t1 SET f2 = 1 WHERE f1 = 3;
UPDATE t1 SET f2 = 1 WHERE f1 = 4;
UPDATE t1 SET f2 = 2 WHERE f1 = 4;
/* dependent applier */
UPDATE t1 SET f2 = 3 WHERE f1 = 4;
/* dependent applier */
UPDATE t1 SET f2 = 1 WHERE f1 = 5;
UPDATE t1 SET f2 = 1 WHERE f1 = 6;
UPDATE t1 SET f2 = 1 WHERE f1 = 7;
UPDATE t1 SET f2 = 1 WHERE f1 = 8;
connection node_2;
SET wsrep_on=OFF;
SET wsrep_on=ON;
UNLOCK TABLES;
SET SESSION wsrep_on = ON;
SET SESSION wsrep_sync_wait = 15;
SET SESSION wsrep_on = ON;
SET SESSION wsrep_sync_wait = 15;
connection node_1;
SET SESSION wsrep_on = ON;
SET SESSION wsrep_sync_wait = 15;
SHOW STATUS LIKE 'wsrep_cluster_size';
Variable_name Value
wsrep_cluster_size 2
SELECT * FROM t1;
f1 f2
1 1
2 1
3 1
4 3
5 1
6 1
7 1
8 1
connection node_2;
SET GLOBAL wsrep_on=OFF;
# restart
DROP TABLE t1;
connection node_1;
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 INT);
START TRANSACTION;
INSERT INTO t1 VALUES (1, 0);
INSERT INTO t1 VALUES (2, 0);
INSERT INTO t1 VALUES (3, 0);
INSERT INTO t1 VALUES (4, 0);
INSERT INTO t1 VALUES (5, 0);
INSERT INTO t1 VALUES (6, 0);
INSERT INTO t1 VALUES (7, 0);
INSERT INTO t1 VALUES (8, 0);
COMMIT;
CREATE TABLE t2 (f1 INTEGER PRIMARY KEY, f2 INT);
connection node_2;
SET GLOBAL wsrep_provider_options='gcs.fc_limit=1K';
SET wsrep_on=OFF;
DROP TABLE t2;
SET wsrep_on=ON;
SET GLOBAL wsrep_provider_options = 'dbug=d,after_replicate_sync';
LOCK TABLES t1 READ;
connection node_1;
UPDATE t1 SET f2 = 1 WHERE f1 = 1;
UPDATE t1 SET f2 = 1 WHERE f1 = 2;
UPDATE t1 SET f2 = 1 WHERE f1 = 3;
UPDATE t1 SET f2 = 1 WHERE f1 = 4;
UPDATE t1 SET f2 = 2 WHERE f1 = 4;
/* dependent applier */;
connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2;
connection node_2a;
DROP TABLE t2;;
connection node_2;
SET wsrep_on=OFF;
"Wait for DROP TABLE to replicate"
SET SESSION wsrep_on = 0;
SET SESSION wsrep_on = 0;
SET GLOBAL wsrep_provider_options = 'signal=after_replicate_sync';
SET GLOBAL wsrep_provider_options = 'dbug=';
"DROP TABLE replicated"
SET wsrep_on=ON;
connection node_1;
UPDATE t1 SET f2 = 3 WHERE f1 = 4;
/* dependent applier */
UPDATE t1 SET f2 = 1 WHERE f1 = 5;
UPDATE t1 SET f2 = 1 WHERE f1 = 6;
UPDATE t1 SET f2 = 1 WHERE f1 = 7;
UPDATE t1 SET f2 = 1 WHERE f1 = 8;
connection node_2;
SET wsrep_on=OFF;
SET wsrep_on=ON;
UNLOCK TABLES;
connection node_2a;
ERROR 42S02: Unknown table 'test.t2'
connection node_1;
SET SESSION wsrep_on = ON;
SET SESSION wsrep_sync_wait = 15;
SHOW STATUS LIKE 'wsrep_cluster_size';
Variable_name Value
wsrep_cluster_size 2
SELECT * FROM t1;
f1 f2
1 1
2 1
3 1
4 3
5 1
6 1
7 1
8 1
connection node_2;
SET SESSION wsrep_on = ON;
SET SESSION wsrep_sync_wait = 15;
SET SESSION wsrep_on = ON;
SET SESSION wsrep_sync_wait = 15;
SET GLOBAL wsrep_on=OFF;
# restart
DROP TABLE t1;
CALL mtr.add_suppression('mysqld: Can\'t find record in \'t1\'');
CALL mtr.add_suppression('Update_rows_v1 apply failed');
CALL mtr.add_suppression('Inconsistency detected: Inconsistent by consensus on');
!include ../galera_3nodes.cnf
[mysqld]
wsrep-ignore-apply-errors=0
wsrep_sync_wait=0
\ No newline at end of file
--source include/galera_cluster.inc
--source include/have_innodb.inc
#
# 1. Create different inconsistencies on nodes 2 and 3
#
--connection node_2
SET wsrep_on=OFF;
DROP SCHEMA test;
--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3
--connection node_3
SET wsrep_on=OFF;
CREATE TABLE test.t1 (f1 INTEGER);
#
# 2. The following should generate different errors on nodes 2 and 3 and
# trigger voting with 3 different votes. node_1 should remain alone
# in the cluster.
#
--connection node_1
CREATE TABLE test.t1 (f1 INTEGER);
--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'
--source include/wait_condition.inc
--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'
--source include/wait_condition.inc
SHOW STATUS LIKE 'wsrep_cluster_status';
# Test cleanup
DROP TABLE test.t1;
#
# 3. Wait for nodes 2 and 3 to drop out of the cluster and restart them to
# recover the initial configuration.
#
--connection node_2
SET SESSION wsrep_sync_wait=0;
--let $wait_condition = SELECT VARIABLE_VALUE = 'OFF' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'
--source include/wait_condition.inc
SHOW STATUS LIKE 'wsrep_cluster_status';
# need to reinitialize connection due to a "Bad handshake" bug
--disconnect node_2
--connect node_2, 127.0.0.1, root, , mysql, $NODE_MYPORT_2
--source include/kill_galera.inc
--connection node_2
--source include/wait_until_disconnected.inc
--echo Starting node_2
--source include/start_mysqld.inc
--connection node_3
SET SESSION wsrep_sync_wait=0;
--let $wait_condition = SELECT VARIABLE_VALUE = 'OFF' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'
--source include/wait_condition.inc
SHOW STATUS LIKE 'wsrep_cluster_status';
# need to reinitialize connection due to a "Bad handshake" bug
--disconnect node_3
--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3
--source include/kill_galera.inc
--connection node_3
--source include/wait_until_disconnected.inc
--echo Starting node_3
--source include/start_mysqld.inc
--connection node_1
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'
--source include/wait_condition.inc
--echo Nodes 2 and 3 started
--connection node_2
# fix the default schema
USE test;
--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'
--source include/wait_condition.inc
--echo Node 2 synced
CALL mtr.add_suppression("Slave SQL: Error 'Unknown database 'test'' on query. Default database: 'test'. Query: 'CREATE TABLE test.t1 \\\(f1 INTEGER\\\)', Error_code: 1049");
CALL mtr.add_suppression("Query apply failed");
CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on .*");
CALL mtr.add_suppression("Plugin 'InnoDB' will be forced to shutdown");
--connection node_3
--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'
--source include/wait_condition.inc
--echo Node 3 synced
CALL mtr.add_suppression("Slave SQL: Error 'Table 't1' already exists' on query. Default database: 'test'. Query: 'CREATE TABLE test.t1 \\\(f1 INTEGER\\\)', Error_code: 1050");
CALL mtr.add_suppression("Query apply failed");
CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on .*");
CALL mtr.add_suppression("Plugin 'InnoDB' will be forced to shutdown");
!include ../galera_3nodes.cnf
[mysqld]
wsrep-ignore-apply-errors=0
# [mysqld.3]
# wsrep-sst-method=mysqldump
# wsrep_sst_receive_address=127.0.0.2:@mysqld.3.port
#
# GCF-363 Inconsistency voting: If in a 3-node cluster the nodes with applier
# error survive, the other node can not join properly
#
--source include/galera_cluster.inc
--source include/have_innodb.inc
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)) ENGINE=InnoDB;
--connection node_1
SET GLOBAL wsrep_on=OFF;
INSERT INTO t1 VALUES (1, 'a');
SET GLOBAL wsrep_on=ON;
--connection node_2
SET GLOBAL wsrep_on=OFF;
INSERT INTO t1 VALUES (1, 'a');
SET GLOBAL wsrep_on=ON;
--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3
--connection node_3
INSERT INTO t1 VALUES (1, 'b');
SET SESSION wsrep_sync_wait = 0;
--let $wait_condition = SELECT VARIABLE_VALUE = 'OFF' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'
--source include/wait_condition.inc
SHOW STATUS LIKE 'wsrep_cluster_status';
--connection node_1
# Wait until node #3 leaves the cluster
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'
--source include/wait_condition.inc
--connection node_3
SET SESSION wsrep_on=OFF;
--source include/restart_mysqld.inc
--source include/wait_until_connected_again.inc
SET SESSION wsrep_on=ON;
--connection node_1
SELECT * FROM t1;
--connection node_2
SELECT * FROM t1;
--connection node_3
SELECT * FROM t1;
DROP TABLE t1;
--connection node_1
CALL mtr.add_suppression("Slave SQL: Could not execute Write_rows event on table test.t1; Duplicate entry '1' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log FIRST, end_log_pos 155, Error_code: 1062");
CALL mtr.add_suppression("WSREP: Event 3 Write_rows_v1 apply failed: 121, seqno ");
--connection node_2
CALL mtr.add_suppression("Slave SQL: Could not execute Write_rows event on table test.t1; Duplicate entry '1' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log FIRST, end_log_pos 155, Error_code: 1062");
CALL mtr.add_suppression("WSREP: Event 3 Write_rows_v1 apply failed: 121, seqno ");
--connection node_3
CALL mtr.add_suppression("WSREP: Vote 0 \\\(success\\\) on (.*) is inconsistent with group. Leaving cluster.");
CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on ");
CALL mtr.add_suppression("Plugin 'InnoDB' will be forced to shutdown");
!include ../galera_3nodes.cnf
[mysqld]
wsrep-ignore-apply-errors=0
#
# GCF-376: slaves become inconsistent if master goes non-prim during
# inconsistency voting
#
--source include/galera_cluster.inc
--source include/have_innodb.inc
--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3
--connection node_1
# Save original auto_increment_offset values.
--let $node_1=node_1
--let $node_2=node_2
--let $node_3=node_3
--source ../galera/include/auto_increment_offset_save.inc
CREATE TABLE test.t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)) ENGINE=InnoDB;
--connection node_2
SET GLOBAL wsrep_on=OFF;
INSERT INTO t1 VALUES (1, 'a');
SET GLOBAL wsrep_on=ON;
LOCK TABLE t1 WRITE;
--connection node_1
INSERT INTO t1 VALUES (1, 'b');
SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1';
SET SESSION wsrep_sync_wait=0;
# Wait until node #1 leaves the cluster
--connection node_3
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'
--source include/wait_condition.inc
--connection node_2
UNLOCK TABLES;
# Wait until node #2 leaves the cluster
--source include/wsrep_wait_disconnect.inc
--connection node_1
SHOW STATUS LIKE 'wsrep_cluster_status';
--connection node_2
SET SESSION wsrep_sync_wait=0;
SHOW STATUS LIKE 'wsrep_cluster_status';
SHOW STATUS LIKE 'wsrep_cluster_size';
SET GLOBAL wsrep_on=OFF;
SELECT * FROM t1;
--connection node_3
SET SESSION wsrep_sync_wait=0;
--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'
--source include/wait_condition.inc
SHOW STATUS LIKE 'wsrep_cluster_status';
SHOW STATUS LIKE 'wsrep_cluster_size';
SELECT * FROM t1;
# reconnect node #1
--connection node_1
SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0';
# reconnect node #2
--connection node_2
--source include/restart_mysqld.inc
--source include/wait_until_connected_again.inc
--connection node_1
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'
--source include/wait_condition.inc
SELECT * FROM t1;
--connection node_2
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'
--source include/wait_condition.inc
SELECT * FROM t1;
--connection node_3
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'
--source include/wait_condition.inc
SELECT * FROM t1;
DROP TABLE t1;
# Restore original auto_increment_offset values.
--source ../galera/include/auto_increment_offset_restore.inc
--connection node_2
CALL mtr.add_suppression("Slave SQL: Could not execute Write_rows event on table test.t1; Duplicate entry '1' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log FIRST, end_log_pos (.*), Error_code: 1062");
CALL mtr.add_suppression("WSREP: Event (.*) Write_rows_v1 apply failed: 121, seqno ");
CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on (.*)");
CALL mtr.add_suppression("Plugin 'InnoDB' will be forced to shutdown");
#
# This test tests voting (successful slave wins) in the absence of the master
# for trasaction.
#
--source include/galera_cluster.inc
--source include/have_innodb.inc
--let $galera_connection_name = node_3
--let $galera_server_number = 3
--source include/galera_connect.inc
# Save original auto_increment_offset values.
--let $node_1=node_1
--let $node_2=node_2
--let $node_3=node_3
--source ../galera/include/auto_increment_offset_save.inc
CREATE TABLE test.t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB;
--connection node_2
--let $wsrep_provider_orig = `SELECT @@wsrep_provider`
--let $wsrep_cluster_address_orig = `SELECT @@wsrep_cluster_address`
SET wsrep_on=OFF;
INSERT INTO t1 VALUES (1);
LOCK TABLE t1 WRITE;
SET GLOBAL wsrep_sync_wait=0;
--connection node_1
INSERT INTO t1 VALUES (1);
SET GLOBAL wsrep_sync_wait=0;
SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1';
--connection node_3
# wait for node_1 to disappear
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
--connection node_2
UNLOCK TABLES;
# wait to go non-Primary due to inconsistency voting
#--let $wait_condition = SELECT VARIABLE_VALUE = 'non-Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
#--source include/wait_condition.inc
# Somehow the above times out so we use connectin to node 3
--connection node_3
# wait for node_1 to disappear
--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
--connection node_1
SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0';
--source include/galera_wait_ready.inc
SET GLOBAL wsrep_sync_wait=15;
DROP TABLE test.t1;
# reconnect node 2, since it is now inconsistent
--connection node_2
--source include/kill_galera.inc
--source include/wait_until_disconnected.inc
--source include/start_mysqld.inc
--connection node_2
CALL mtr.add_suppression("Inconsistent by consensus.");
CALL mtr.add_suppression("Slave SQL: Could not execute Write_rows event on table test.t1; Duplicate entry '1' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log FIRST");
CALL mtr.add_suppression("WSREP: Event 3 Write_rows_v1 apply failed: 121, seqno");
CALL mtr.add_suppression("WSREP: Failed to apply trx: source: ");
CALL mtr.add_suppression("WSREP: Failed to apply app buffer: seqno:");
CALL mtr.add_suppression("WSREP: Node consistency compromized, leaving cluster...");
# Restore original auto_increment_offset values.
--source ../galera/include/auto_increment_offset_restore.inc
...@@ -26,8 +26,11 @@ SET GLOBAL wsrep_provider_options = 'evs.inactive_timeout=PT100M; evs.suspect_ti ...@@ -26,8 +26,11 @@ SET GLOBAL wsrep_provider_options = 'evs.inactive_timeout=PT100M; evs.suspect_ti
--let $wsrep_provider_options_node2 = `SELECT @@wsrep_provider_options` --let $wsrep_provider_options_node2 = `SELECT @@wsrep_provider_options`
SET GLOBAL wsrep_provider_options = 'evs.inactive_timeout=PT100M; evs.suspect_timeout=PT1S'; SET GLOBAL wsrep_provider_options = 'evs.inactive_timeout=PT100M; evs.suspect_timeout=PT1S';
# Suspend node #3 --connection node_3
--source include/wait_until_connected_again.inc
--let $wsrep_cluster_address_node3 = `SELECT @@wsrep_cluster_address`
# Suspend node #3
--connection node_3 --connection node_3
--source include/galera_suspend.inc --source include/galera_suspend.inc
--sleep 5 --sleep 5
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
--connection node_1 --connection node_1
SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight'; SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight';
SET GLOBAL wsrep_provider_options = 'pc.weight=3'; SET GLOBAL wsrep_provider_options = 'pc.weight=3';
SELECT VARIABLE_VALUE = 5 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight'; SELECT VARIABLE_VALUE AS expect_5 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight';
# Isolate node_1 from the cluster. # Isolate node_1 from the cluster.
SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1'; SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1';
...@@ -62,15 +62,15 @@ SHOW STATUS LIKE 'wsrep_local_state_comment'; ...@@ -62,15 +62,15 @@ SHOW STATUS LIKE 'wsrep_local_state_comment';
--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' --let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'
--source include/wait_condition.inc --source include/wait_condition.inc
SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight'; SELECT VARIABLE_VALUE AS expect_3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight';
SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; SELECT VARIABLE_VALUE AS expect_Primary FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected'; SELECT VARIABLE_VALUE AS expect_ON FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected';
SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; SELECT VARIABLE_VALUE AS expect_ON FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state'; SELECT VARIABLE_VALUE AS expect_4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state';
SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; SELECT VARIABLE_VALUE AS expect_Synced FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
SET GLOBAL wsrep_provider_options = 'pc.weight=1'; SET GLOBAL wsrep_provider_options = 'pc.weight=1';
SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight'; SELECT VARIABLE_VALUE AS expect_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight';
# Resume cluster connectivity on node_1 # Resume cluster connectivity on node_1
--connection node_1 --connection node_1
...@@ -78,44 +78,42 @@ SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0'; ...@@ -78,44 +78,42 @@ SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0';
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' --let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'
--source include/wait_condition.inc --source include/wait_condition.inc
--source include/galera_wait_ready.inc
--connection node_2 --connection node_2
--source include/wait_condition.inc --source include/wait_condition.inc
--source include/galera_wait_ready.inc
--connection node_3 --connection node_3
--source include/wait_condition.inc --source include/wait_condition.inc
--source include/galera_wait_ready.inc
--connection node_1
--source include/wait_condition.inc
# On all nodes, we now expect a Primary component of size 3, weight 3, Synced and ready # On all nodes, we now expect a Primary component of size 3, weight 3, Synced and ready
SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; SELECT VARIABLE_VALUE AS expect_3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight'; SELECT VARIABLE_VALUE AS expect_3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight';
SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; SELECT VARIABLE_VALUE AS expect_Primary FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected'; SELECT VARIABLE_VALUE AS expect_ON FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected';
SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; SELECT VARIABLE_VALUE AS expect_ON FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state'; SELECT VARIABLE_VALUE AS expect_4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state';
SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; SELECT VARIABLE_VALUE AS expect_Synced FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
--connection node_2 --connection node_2
SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; SELECT VARIABLE_VALUE AS expect_3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight'; SELECT VARIABLE_VALUE AS expect_3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight';
SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; SELECT VARIABLE_VALUE AS expect_Primary FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected'; SELECT VARIABLE_VALUE AS expect_ON FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected';
SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; SELECT VARIABLE_VALUE AS expect_ON FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state'; SELECT VARIABLE_VALUE AS expect_4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state';
SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; SELECT VARIABLE_VALUE AS expect_Synced FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
--connection node_3
SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight';
SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected';
SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state';
SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
--connection node_1 --connection node_1
SELECT VARIABLE_VALUE AS expect_3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
SELECT VARIABLE_VALUE AS expect_3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_weight';
SELECT VARIABLE_VALUE AS expect_Primary FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
SELECT VARIABLE_VALUE AS expect_ON FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected';
SELECT VARIABLE_VALUE AS expect_ON FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
SELECT VARIABLE_VALUE AS expect_4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state';
SELECT VARIABLE_VALUE AS expect_Synced FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
SET GLOBAL wsrep_provider_options = 'pc.weight=1'; SET GLOBAL wsrep_provider_options = 'pc.weight=1';
--let $wait_condition = SELECT @@wsrep_provider_options LIKE '%pc.weight = 1%' --let $wait_condition = SELECT @@wsrep_provider_options LIKE '%pc.weight = 1%'
...@@ -124,10 +122,10 @@ SET GLOBAL wsrep_provider_options = 'pc.weight=1'; ...@@ -124,10 +122,10 @@ SET GLOBAL wsrep_provider_options = 'pc.weight=1';
CALL mtr.add_suppression('WSREP: gcs_caused\\(\\) returned -1'); CALL mtr.add_suppression('WSREP: gcs_caused\\(\\) returned -1');
--connection node_2 --connection node_2
CALL mtr.add_suppression('overriding reported weight for');
CALL mtr.add_suppression('SYNC message from member'); CALL mtr.add_suppression('SYNC message from member');
CALL mtr.add_suppression('user message in state LEAVING'); CALL mtr.add_suppression('user message in state LEAVING');
CALL mtr.add_suppression('sending install message failed: (Transport endpoint is not connected|Socket is not connected)'); CALL mtr.add_suppression('sending install message failed: (Transport endpoint is not connected|Socket is not connected)');
CALL mtr.add_suppression('overriding reported weight for');
--connection node_3 --connection node_3
CALL mtr.add_suppression('WSREP: user message in state LEAVING'); CALL mtr.add_suppression('WSREP: user message in state LEAVING');
......
!include ../galera_3nodes.cnf
[mysqld]
wsrep-ignore-apply-errors=0
wsrep_sync_wait=0
#
# This test tests that TOI failure on 2 nodes (master and slave) for the
# same reason, wins over success on a third slave.
# In particular this tests that master and slave TOI cast the same vote for
# the same error
#
--source include/galera_cluster.inc
--source include/have_innodb.inc
--let $galera_connection_name = node_3
--let $galera_server_number = 3
--source include/galera_connect.inc
# Save original auto_increment_offset values.
--let $node_1=node_1
--let $node_2=node_2
--let $node_3=node_3
--source ../galera/include/auto_increment_offset_save.inc
# create inconsistency on node 3
--connection node_3
SET SESSION wsrep_on=OFF;
DROP SCHEMA test;
# This should fail on nodes 1 and 2 and succeed on node 3
--connection node_1
--error ER_DB_CREATE_EXISTS
CREATE SCHEMA test;
--connection node_1
SET SESSION wsrep_sync_wait=0;
# wait for node 3 to drop from the cluster
--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 = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
--source include/wait_condition.inc
--connection node_2
SET SESSION wsrep_sync_wait=0;
# wait for node 3 to drop from the cluster
--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 = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
--source include/wait_condition.inc
--connection node_3
SET SESSION wsrep_sync_wait=0;
--let $wait_condition = SELECT VARIABLE_VALUE = 'Disconnected' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
--source include/wait_condition.inc
# need to reinitialize connection due to a "Bad handshake" bug
--disconnect node_3
--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3
# reconnect node 3, since it failed
--source include/kill_galera.inc
--source include/wait_until_disconnected.inc
--source include/start_mysqld.inc
--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
--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
CALL mtr.add_suppression("WSREP: Vote 0 \\\(success\\\) on (.*) is inconsistent with group. Leaving cluster.");
# Restore original auto_increment_offset values.
--source ../galera/include/auto_increment_offset_restore.inc
!include ../galera_3nodes.cnf
[mysqld]
wsrep-ignore-apply-errors=0
#
# Test that mysqldump SST is possible after a vote without a cluster restart
#
--source include/galera_cluster.inc
--source suite/galera/include/galera_sst_set_mysqldump.inc
--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3
# Save original auto_increment_offset values.
--let $node_1=node_1
--let $node_2=node_2
--let $node_3=node_3
--source ../galera/include/auto_increment_offset_save.inc
--connection node_1
CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB;
# Introduce inconsistency on node #2
--connection node_2
--let $wsrep_cluster_address_node2 = `SELECT @@wsrep_cluster_address`
SET SESSION wsrep_on=OFF;
ALTER TABLE t1 ADD PRIMARY KEY (f1);
SET SESSION wsrep_on=ON;
# Run DDL that will fail on nodes #1 and #3 but succeed on node #2
--connection node_1
--error ER_CANT_DROP_FIELD_OR_KEY
ALTER TABLE t1 LOCK=SHARED, DROP PRIMARY KEY;
# Nodes #1 and #3 remain in the cluster
--connection node_1
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
SELECT VARIABLE_VALUE AS expect_Primary FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
--connection node_3
SELECT VARIABLE_VALUE AS expect_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
SELECT VARIABLE_VALUE AS expect_Primary FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
# Node #2 is kicked out
--connection node_2
SET SESSION wsrep_on=OFF;
SELECT VARIABLE_VALUE AS expect_Disconnected FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
SET SESSION wsrep_on=ON;
# Restore cluster
--disable_query_log
--eval SET GLOBAL wsrep_cluster_address = '$wsrep_cluster_address_node2'
--enable_query_log
--enable_reconnect
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
SELECT VARIABLE_VALUE AS expect_Primary FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
# Confirm that the table is now identical throughout
--connection node_1
SHOW CREATE TABLE t1;
--connection node_2
SET SESSION wsrep_on=OFF;
--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
--source include/wait_condition.inc
--source include/galera_wait_ready.inc
SET SESSION wsrep_on=ON;
# restart node so we don't fail on WSREP_START_POSITION internal check
--source include/restart_mysqld.inc
--source include/wait_until_connected_again.inc
SHOW CREATE TABLE t1;
SELECT COUNT(*) AS expect_0 FROM t1;
CALL mtr.add_suppression("is inconsistent with group");
--connection node_3
SHOW CREATE TABLE t1;
DROP TABLE t1;
CALL mtr.add_suppression("Slave SQL: Error 'Can't DROP 'PRIMARY'; check that column/key exists'");
--connection node_1
--source suite/galera/include/galera_sst_restore.inc
# Restore original auto_increment_offset values.
--source ../galera/include/auto_increment_offset_restore.inc
!include ../galera_3nodes.cnf
[mysqld]
wsrep-slave-threads=8
wsrep-ignore-apply-errors=0
[ENV]
galera_cluster_size = 3
#
# Check that the node can cleanly shutdown in case of inconsistency
# (no locked up threads)
#
--source include/galera_cluster.inc
--source include/have_innodb.inc
# Save original auto_increment_offset values.
--let $node_1=node_1
--let $node_2=node_2
--let $node_3=node_3
--source ../galera/include/auto_increment_offset_save.inc
--connection node_2
SELECT @@wsrep_slave_threads = 8;
#
# 1. Inconsistency on slave
#
--connection node_1
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 INT);
INSERT INTO t1 VALUES (1, 0),(2, 0),(3, 0),(4, 0),(5, 0),(6, 0),(7, 0),(8, 0);
--connection node_2
# Allow 1K slave queue woithout flow control
SET GLOBAL wsrep_provider_options='gcs.fc_limit=1K';
# Introduce 2 inconsistencies
SET wsrep_on=OFF;
DELETE FROM t1 WHERE f1 = 2;
DELETE FROM t1 WHERE f1 = 4;
SET wsrep_on=ON;
# Build up slave queue:
# - first 8 events will be picked by slave threads
# - one moreevent will be waiting in slave queue
LOCK TABLES t1 WRITE;
--connection node_1
UPDATE t1 SET f2 = 1 WHERE f1 = 1;
UPDATE t1 SET f2 = 1 WHERE f1 = 2;
UPDATE t1 SET f2 = 1 WHERE f1 = 3;
UPDATE t1 SET f2 = 1 WHERE f1 = 4;
UPDATE t1 SET f2 = 2 WHERE f1 = 4; /* dependent applier */
UPDATE t1 SET f2 = 3 WHERE f1 = 4; /* dependent applier */
UPDATE t1 SET f2 = 1 WHERE f1 = 5;
UPDATE t1 SET f2 = 1 WHERE f1 = 6;
UPDATE t1 SET f2 = 1 WHERE f1 = 7;
UPDATE t1 SET f2 = 1 WHERE f1 = 8;
--connection node_2
# make sure all events landed to slave queue
SET wsrep_on=OFF;
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_recv_queue';
--source include/wait_condition.inc
SET wsrep_on=ON;
UNLOCK TABLES;
--source include/wsrep_wait_disconnect.inc
# Wait for the node to shutdown replication
--let $members=0
--source include/wsrep_wait_membership.inc
--connection node_1
--let $members=2
--source include/wsrep_wait_membership.inc
--source include/wait_until_ready.inc
SHOW STATUS LIKE 'wsrep_cluster_size';
SELECT * FROM t1;
--connection node_2
#Gracefully restart the node
SET GLOBAL wsrep_on=OFF;
--source include/shutdown_mysqld.inc
--source include/start_mysqld.inc
--source include/galera_wait_ready.inc
DROP TABLE t1;
#
# 2. Inconsistency on master
#
--connection node_1
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 INT);
START TRANSACTION;
INSERT INTO t1 VALUES (1, 0);
INSERT INTO t1 VALUES (2, 0);
INSERT INTO t1 VALUES (3, 0);
INSERT INTO t1 VALUES (4, 0);
INSERT INTO t1 VALUES (5, 0);
INSERT INTO t1 VALUES (6, 0);
INSERT INTO t1 VALUES (7, 0);
INSERT INTO t1 VALUES (8, 0);
COMMIT;
CREATE TABLE t2 (f1 INTEGER PRIMARY KEY, f2 INT);
--connection node_2
# Allow 1K slave queue without flow control
SET GLOBAL wsrep_provider_options='gcs.fc_limit=1K';
# Introduce inconsistency
SET wsrep_on=OFF;
DROP TABLE t2;
SET wsrep_on=ON;
# set up sync point to ensure DROP TABLE replication order below
--let galera_sync_point = after_replicate_sync
--source include/galera_set_sync_point.inc
# Build up slave queue:
# - first 8 events will be picked by slave threads
# - one more event will be waiting in slave queue
LOCK TABLES t1 READ;
--connection node_1
UPDATE t1 SET f2 = 1 WHERE f1 = 1;
UPDATE t1 SET f2 = 1 WHERE f1 = 2;
UPDATE t1 SET f2 = 1 WHERE f1 = 3;
UPDATE t1 SET f2 = 1 WHERE f1 = 4;
UPDATE t1 SET f2 = 2 WHERE f1 = 4; /* dependent applier */;
# interleave a failing statement
--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2
--connection node_2a
--send DROP TABLE t2;
# make sure DROP TABLE from above has replicated
--connection node_2
SET wsrep_on=OFF;
--echo "Wait for DROP TABLE to replicate"
--source include/galera_wait_sync_point.inc
--source include/galera_signal_sync_point.inc
--source include/galera_clear_sync_point.inc
--echo "DROP TABLE replicated"
SET wsrep_on=ON;
--connection node_1
UPDATE t1 SET f2 = 3 WHERE f1 = 4; /* dependent applier */
UPDATE t1 SET f2 = 1 WHERE f1 = 5;
UPDATE t1 SET f2 = 1 WHERE f1 = 6;
UPDATE t1 SET f2 = 1 WHERE f1 = 7;
UPDATE t1 SET f2 = 1 WHERE f1 = 8;
--connection node_2
# make sure all events landed to slave queue
SET wsrep_on=OFF;
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_recv_queue';
--source include/wait_condition.inc
SET wsrep_on=ON;
UNLOCK TABLES;
--connection node_2a
--error ER_BAD_TABLE_ERROR
--reap
--connection node_1
--let $members=2
--source include/wsrep_wait_membership.inc
--source include/wait_until_ready.inc
SHOW STATUS LIKE 'wsrep_cluster_size';
SELECT * FROM t1;
--connection node_2
--source include/wsrep_wait_disconnect.inc
# Wait for the node to shutdown replication
--let $members=0
--source include/wsrep_wait_membership.inc
# Gracefully restart the node
SET GLOBAL wsrep_on=OFF;
--source include/shutdown_mysqld.inc
--source include/start_mysqld.inc
--source include/galera_wait_ready.inc
DROP TABLE t1;
CALL mtr.add_suppression('mysqld: Can\'t find record in \'t1\'');
CALL mtr.add_suppression('Update_rows_v1 apply failed');
CALL mtr.add_suppression('Inconsistency detected: Inconsistent by consensus on');
CALL mtr.add_suppression('last left .* greater than drain seqno');
# Restore original auto_increment_offset values.
--source ../galera/include/auto_increment_offset_restore.inc
connection node_2;
connection node_1;
connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3;
connection node_1;
connection node_2;
connection node_3;
Inconsistency on the first fragment
connection node_1;
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 BLOB) ENGINE=InnoDB;
connection node_2;
SET SESSION wsrep_on=OFF;
INSERT INTO t1 VALUES (1, 'X');
SET SESSION wsrep_on=ON;
DELETE FROM t1 WHERE f1 = 2;
connection node_1;
SET AUTOCOMMIT=OFF;
SET SESSION wsrep_trx_fragment_size = 131070;
START TRANSACTION;
INSERT INTO t1 VALUES (1, REPEAT('A', 65535));
INSERT INTO t1 VALUES (2, REPEAT('A', 65535));
INSERT INTO t1 VALUES (3, REPEAT('A', 65535));
INSERT INTO t1 VALUES (4, REPEAT('A', 65535));
INSERT INTO t1 VALUES (5, REPEAT('A', 65535));
COMMIT;
SELECT COUNT(*) AS expect_0 FROM mysql.wsrep_streaming_log;
expect_0
0
START TRANSACTION;
INSERT INTO t1 VALUES (11, REPEAT('A', 65535));
INSERT INTO t1 VALUES (12, REPEAT('A', 65535));
INSERT INTO t1 VALUES (13, REPEAT('A', 65535));
INSERT INTO t1 VALUES (14, REPEAT('A', 65535));
INSERT INTO t1 VALUES (15, REPEAT('A', 65535));
connection node_2;
SET SESSION wsrep_on=OFF;
Starting mysqld
# restart
connection node_1;
connection node_2;
SELECT COUNT(*) > 0 FROM mysql.wsrep_streaming_log;
COUNT(*) > 0
1
connection node_1;
COMMIT;
connection node_1;
SELECT COUNT(*) AS expect_0 FROM mysql.wsrep_streaming_log;
expect_0
0
SELECT COUNT(*) AS expect_10 FROM t1;
expect_10
10
connection node_2;
SELECT COUNT(*) AS expect_0 FROM mysql.wsrep_streaming_log;
expect_0
0
SELECT COUNT(*) AS expect_10 FROM t1;
expect_10
10
connection node_3;
SELECT COUNT(*) AS expect_0 FROM mysql.wsrep_streaming_log;
expect_0
0
SELECT COUNT(*) AS expect_10 FROM t1;
expect_10
10
connection node_1;
DROP TABLE t1;
Inconsistency on a middle fragment
connection node_1;
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 BLOB) ENGINE=InnoDB;
connection node_2;
SET SESSION wsrep_on=OFF;
INSERT INTO t1 VALUES (3, 'X');
SET SESSION wsrep_on=ON;
DELETE FROM t1 WHERE f1 = 2;
connection node_1;
SET AUTOCOMMIT=OFF;
SET SESSION wsrep_trx_fragment_size = 131070;
START TRANSACTION;
INSERT INTO t1 VALUES (1, REPEAT('A', 65535));
INSERT INTO t1 VALUES (2, REPEAT('A', 65535));
INSERT INTO t1 VALUES (3, REPEAT('A', 65535));
INSERT INTO t1 VALUES (4, REPEAT('A', 65535));
INSERT INTO t1 VALUES (5, REPEAT('A', 65535));
COMMIT;
SELECT COUNT(*) AS expect_0 FROM mysql.wsrep_streaming_log;
expect_0
0
START TRANSACTION;
INSERT INTO t1 VALUES (11, REPEAT('A', 65535));
INSERT INTO t1 VALUES (12, REPEAT('A', 65535));
INSERT INTO t1 VALUES (13, REPEAT('A', 65535));
INSERT INTO t1 VALUES (14, REPEAT('A', 65535));
INSERT INTO t1 VALUES (15, REPEAT('A', 65535));
connection node_2;
SET SESSION wsrep_on=OFF;
Starting mysqld
# restart
connection node_1;
connection node_2;
SELECT COUNT(*) > 0 FROM mysql.wsrep_streaming_log;
COUNT(*) > 0
1
connection node_1;
COMMIT;
connection node_1;
SELECT COUNT(*) AS expect_0 FROM mysql.wsrep_streaming_log;
expect_0
0
SELECT COUNT(*) AS expect_10 FROM t1;
expect_10
10
connection node_2;
SELECT COUNT(*) AS expect_0 FROM mysql.wsrep_streaming_log;
expect_0
0
SELECT COUNT(*) AS expect_10 FROM t1;
expect_10
10
connection node_3;
SELECT COUNT(*) AS expect_0 FROM mysql.wsrep_streaming_log;
expect_0
0
SELECT COUNT(*) AS expect_10 FROM t1;
expect_10
10
connection node_1;
DROP TABLE t1;
Inconsistency on the commit fragment
connection node_1;
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 BLOB) ENGINE=InnoDB;
connection node_2;
SET SESSION wsrep_on=OFF;
INSERT INTO t1 VALUES (5, 'X');
SET SESSION wsrep_on=ON;
DELETE FROM t1 WHERE f1 = 2;
connection node_1;
SET AUTOCOMMIT=OFF;
SET SESSION wsrep_trx_fragment_size = 131070;
START TRANSACTION;
INSERT INTO t1 VALUES (1, REPEAT('A', 65535));
INSERT INTO t1 VALUES (2, REPEAT('A', 65535));
INSERT INTO t1 VALUES (3, REPEAT('A', 65535));
INSERT INTO t1 VALUES (4, REPEAT('A', 65535));
INSERT INTO t1 VALUES (5, REPEAT('A', 65535));
COMMIT;
SELECT COUNT(*) AS expect_0 FROM mysql.wsrep_streaming_log;
expect_0
0
START TRANSACTION;
INSERT INTO t1 VALUES (11, REPEAT('A', 65535));
INSERT INTO t1 VALUES (12, REPEAT('A', 65535));
INSERT INTO t1 VALUES (13, REPEAT('A', 65535));
INSERT INTO t1 VALUES (14, REPEAT('A', 65535));
INSERT INTO t1 VALUES (15, REPEAT('A', 65535));
connection node_2;
SET SESSION wsrep_on=OFF;
Starting mysqld
# restart
connection node_1;
connection node_2;
SELECT COUNT(*) > 0 FROM mysql.wsrep_streaming_log;
COUNT(*) > 0
1
connection node_1;
COMMIT;
connection node_1;
SELECT COUNT(*) AS expect_0 FROM mysql.wsrep_streaming_log;
expect_0
0
SELECT COUNT(*) AS expect_10 FROM t1;
expect_10
10
connection node_2;
SELECT COUNT(*) AS expect_0 FROM mysql.wsrep_streaming_log;
expect_0
0
SELECT COUNT(*) AS expect_10 FROM t1;
expect_10
10
connection node_3;
SELECT COUNT(*) AS expect_0 FROM mysql.wsrep_streaming_log;
expect_0
0
SELECT COUNT(*) AS expect_10 FROM t1;
expect_10
10
connection node_1;
DROP TABLE t1;
connection node_2;
CALL mtr.add_suppression("Slave SQL: Could not execute Write_rows event on table test.t1; Duplicate entry '1' for key 'PRIMARY'");
CALL mtr.add_suppression("Slave SQL: Could not execute Write_rows event on table test.t1; Duplicate entry '3' for key 'PRIMARY'");
CALL mtr.add_suppression("Slave SQL: Could not execute Write_rows event on table test.t1; Duplicate entry '5' for key 'PRIMARY'");
CALL mtr.add_suppression("Write_rows_v1 apply failed");
CALL mtr.add_suppression("Inconsistent by consensus");
#
# set $inconsistent_fragment to determine at which fragment inconsistency
# happens
#
--connection node_1
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 BLOB) ENGINE=InnoDB;
# Introduce inconsistency
--connection node_2
SET SESSION wsrep_on=OFF;
--eval INSERT INTO t1 VALUES ($inconsistent_fragment, 'X')
SET SESSION wsrep_on=ON;
DELETE FROM t1 WHERE f1 = 2;
# Perform an SR transaction that will hit the inconsistency
--connection node_1
SET AUTOCOMMIT=OFF;
SET SESSION wsrep_trx_fragment_size = 131070;
START TRANSACTION;
INSERT INTO t1 VALUES (1, REPEAT('A', 65535));
INSERT INTO t1 VALUES (2, REPEAT('A', 65535));
INSERT INTO t1 VALUES (3, REPEAT('A', 65535));
INSERT INTO t1 VALUES (4, REPEAT('A', 65535));
INSERT INTO t1 VALUES (5, REPEAT('A', 65535));
COMMIT;
SELECT COUNT(*) AS expect_0 FROM mysql.wsrep_streaming_log;
# Perform another SR transaction in order to have stuff in the
# wsrep_streaming_log table
START TRANSACTION;
INSERT INTO t1 VALUES (11, REPEAT('A', 65535));
INSERT INTO t1 VALUES (12, REPEAT('A', 65535));
INSERT INTO t1 VALUES (13, REPEAT('A', 65535));
INSERT INTO t1 VALUES (14, REPEAT('A', 65535));
INSERT INTO t1 VALUES (15, REPEAT('A', 65535));
# Node #2 has dropped from the cluster due to voting
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
# Bring node #2 back via SST
--connection node_2
SET SESSION wsrep_on=OFF;
--source include/shutdown_mysqld.inc
--source include/wait_until_disconnected.inc
--echo Starting mysqld
--source include/start_mysqld.inc
--connection node_1
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
--connection node_2
--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
--source include/wait_condition.inc
# Node #2 should have some entries in its SR table post-restart
SELECT COUNT(*) > 0 FROM mysql.wsrep_streaming_log;
# Commit second SR transaction
--connection node_1
COMMIT;
# Confirm that all nodes are identical
--connection node_1
SELECT COUNT(*) AS expect_0 FROM mysql.wsrep_streaming_log;
SELECT COUNT(*) AS expect_10 FROM t1;
--connection node_2
SELECT COUNT(*) AS expect_0 FROM mysql.wsrep_streaming_log;
SELECT COUNT(*) AS expect_10 FROM t1;
--connection node_3
SELECT COUNT(*) AS expect_0 FROM mysql.wsrep_streaming_log;
SELECT COUNT(*) AS expect_10 FROM t1;
--connection node_1
DROP TABLE t1;
#
# Test voting while an SR transaction is in progress
#
--source include/galera_cluster.inc
--source include/big_test.inc
--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3
# Save original auto_increment_offset values.
--let $node_1=node_1
--let $node_2=node_2
--let $node_3=node_3
--source ../galera/include/auto_increment_offset_save.inc
--echo Inconsistency on the first fragment
--let $inconsistent_fragment=1
--source galera_vote_sr.inc
--echo Inconsistency on a middle fragment
--let $inconsistent_fragment=3
--source galera_vote_sr.inc
--echo Inconsistency on the commit fragment
--let $inconsistent_fragment=5
--source galera_vote_sr.inc
--connection node_2
CALL mtr.add_suppression("Slave SQL: Could not execute Write_rows event on table test.t1; Duplicate entry '1' for key 'PRIMARY'");
CALL mtr.add_suppression("Slave SQL: Could not execute Write_rows event on table test.t1; Duplicate entry '3' for key 'PRIMARY'");
CALL mtr.add_suppression("Slave SQL: Could not execute Write_rows event on table test.t1; Duplicate entry '5' for key 'PRIMARY'");
CALL mtr.add_suppression("Write_rows_v1 apply failed");
CALL mtr.add_suppression("Inconsistent by consensus");
#CALL mtr.add_suppression("no THD for trx");
# Restore original auto_increment_offset values.
--source ../galera/include/auto_increment_offset_restore.inc
...@@ -10,6 +10,8 @@ SET GLOBAL wsrep_sst_auth = 'sst:'; ...@@ -10,6 +10,8 @@ SET GLOBAL wsrep_sst_auth = 'sst:';
connection node_2; connection node_2;
SET GLOBAL wsrep_sst_method = 'mysqldump'; SET GLOBAL wsrep_sst_method = 'mysqldump';
connection node_1; connection node_1;
connection node_2;
connection node_1;
CREATE TABLE ten (f1 INTEGER); CREATE TABLE ten (f1 INTEGER);
INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY AUTO_INCREMENT, f2 CHAR(255)) ENGINE=InnoDB; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY AUTO_INCREMENT, f2 CHAR(255)) ENGINE=InnoDB;
......
...@@ -7,6 +7,11 @@ ...@@ -7,6 +7,11 @@
--source suite/galera/include/galera_sst_set_mysqldump.inc --source suite/galera/include/galera_sst_set_mysqldump.inc
# Save original auto_increment_offset values.
--let $node_1=node_1
--let $node_2=node_2
--source ../../galera/include/auto_increment_offset_save.inc
--connection node_1 --connection node_1
CREATE TABLE ten (f1 INTEGER); CREATE TABLE ten (f1 INTEGER);
INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
...@@ -77,3 +82,6 @@ DROP TABLE ten; ...@@ -77,3 +82,6 @@ DROP TABLE ten;
# with SR, need to disable SR before that. # with SR, need to disable SR before that.
SET SESSION wsrep_trx_fragment_size=0; SET SESSION wsrep_trx_fragment_size=0;
--source suite/galera/include/galera_sst_restore.inc --source suite/galera/include/galera_sst_restore.inc
# Restore original auto_increment_offset values.
--source ../galera/include/auto_increment_offset_restore.inc
...@@ -1537,8 +1537,9 @@ int ha_commit_trans(THD *thd, bool all) ...@@ -1537,8 +1537,9 @@ int ha_commit_trans(THD *thd, bool all)
#endif /* WITH_WSREP */ #endif /* WITH_WSREP */
error= ha_commit_one_phase(thd, all); error= ha_commit_one_phase(thd, all);
#ifdef WITH_WSREP #ifdef WITH_WSREP
if (run_wsrep_hooks) // Here in case of error we must return 2 for inconsistency
error= error || wsrep_after_commit(thd, all); if (run_wsrep_hooks && !error)
error= wsrep_after_commit(thd, all) ? 2 : 0;
#endif /* WITH_WSREP */ #endif /* WITH_WSREP */
goto done; goto done;
} }
...@@ -1607,8 +1608,10 @@ int ha_commit_trans(THD *thd, bool all) ...@@ -1607,8 +1608,10 @@ int ha_commit_trans(THD *thd, bool all)
error= commit_one_phase_2(thd, all, trans, is_real_trans) ? 2 : 0; error= commit_one_phase_2(thd, all, trans, is_real_trans) ? 2 : 0;
#ifdef WITH_WSREP #ifdef WITH_WSREP
if (run_wsrep_hooks && (error || (error = wsrep_after_commit(thd, all)))) if (run_wsrep_hooks &&
(error || (error = wsrep_after_commit(thd, all))))
{ {
error = 2;
mysql_mutex_lock(&thd->LOCK_thd_data); mysql_mutex_lock(&thd->LOCK_thd_data);
if (wsrep_must_abort(thd)) if (wsrep_must_abort(thd))
{ {
......
...@@ -7735,7 +7735,7 @@ MYSQL_BIN_LOG::write_transaction_to_binlog_events(group_commit_entry *entry) ...@@ -7735,7 +7735,7 @@ MYSQL_BIN_LOG::write_transaction_to_binlog_events(group_commit_entry *entry)
Release commit order and if leader, wait for prior commit to Release commit order and if leader, wait for prior commit to
complete. This establishes total order for group leaders. complete. This establishes total order for group leaders.
*/ */
if (wsrep_ordered_commit(entry->thd, entry->all, wsrep_apply_error())) if (wsrep_ordered_commit(entry->thd, entry->all))
{ {
entry->thd->wakeup_subsequent_commits(1); entry->thd->wakeup_subsequent_commits(1);
return 1; return 1;
......
...@@ -270,3 +270,13 @@ extern "C" void wsrep_commit_ordered(THD *thd) ...@@ -270,3 +270,13 @@ extern "C" void wsrep_commit_ordered(THD *thd)
thd->wsrep_cs().ordered_commit(); thd->wsrep_cs().ordered_commit();
} }
} }
extern "C" my_bool wsrep_thd_has_ignored_error(const THD *thd)
{
return thd->wsrep_has_ignored_error;
}
extern "C" void wsrep_thd_set_ignored_error(THD *thd, my_bool val)
{
thd->wsrep_has_ignored_error= val;
}
...@@ -173,7 +173,9 @@ static struct wsrep_service_st wsrep_handler = { ...@@ -173,7 +173,9 @@ static struct wsrep_service_st wsrep_handler = {
wsrep_get_sr_table_name, wsrep_get_sr_table_name,
wsrep_get_debug, wsrep_get_debug,
wsrep_commit_ordered, wsrep_commit_ordered,
wsrep_thd_is_applying wsrep_thd_is_applying,
wsrep_thd_has_ignored_error,
wsrep_thd_set_ignored_error
}; };
static struct thd_specifics_service_st thd_specifics_handler= static struct thd_specifics_service_st thd_specifics_handler=
......
/* Copyright (C) 2013-2015 Codership Oy <info@codership.com> /* Copyright (C) 2013-2019 Codership Oy <info@codership.com>
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
...@@ -24,7 +24,6 @@ ...@@ -24,7 +24,6 @@
#include "wsrep_trans_observer.h" #include "wsrep_trans_observer.h"
#include "slave.h" // opt_log_slave_updates #include "slave.h" // opt_log_slave_updates
#include "log_event.h" // class THD, EVENT_LEN_OFFSET, etc.
#include "debug_sync.h" #include "debug_sync.h"
/* /*
...@@ -60,7 +59,6 @@ static Log_event* wsrep_read_log_event( ...@@ -60,7 +59,6 @@ static Log_event* wsrep_read_log_event(
} }
#include "transaction.h" // trans_commit(), trans_rollback() #include "transaction.h" // trans_commit(), trans_rollback()
#include "rpl_rli.h" // class Relay_log_info;
void wsrep_set_apply_format(THD* thd, Format_description_log_event* ev) void wsrep_set_apply_format(THD* thd, Format_description_log_event* ev)
{ {
...@@ -84,7 +82,7 @@ wsrep_get_apply_format(THD* thd) ...@@ -84,7 +82,7 @@ wsrep_get_apply_format(THD* thd)
return thd->wsrep_rgi->rli->relay_log.description_event_for_exec; return thd->wsrep_rgi->rli->relay_log.description_event_for_exec;
} }
void wsrep_apply_error::store(const THD* const thd) void wsrep_store_error(const THD* const thd, wsrep::mutable_buffer& dst)
{ {
Diagnostics_area::Sql_condition_iterator it= Diagnostics_area::Sql_condition_iterator it=
thd->get_stmt_da()->sql_conditions(); thd->get_stmt_da()->sql_conditions();
...@@ -92,27 +90,10 @@ void wsrep_apply_error::store(const THD* const thd) ...@@ -92,27 +90,10 @@ void wsrep_apply_error::store(const THD* const thd)
static size_t const max_len= 2*MAX_SLAVE_ERRMSG; // 2x so that we have enough static size_t const max_len= 2*MAX_SLAVE_ERRMSG; // 2x so that we have enough
if (NULL == str_) dst.resize(max_len);
{
// this must be freeable by standard free()
str_= static_cast<char*>(malloc(max_len));
if (NULL == str_)
{
WSREP_ERROR("Failed to allocate %zu bytes for error buffer.", max_len);
len_= 0;
return;
}
}
else
{
/* This is possible when we invoke rollback after failed applying.
* In this situation DA should not be reset yet and should contain
* all previous errors from applying and new ones from rollbacking,
* so we just overwrite is from scratch */
}
char* slider= str_; char* slider= dst.data();
const char* const buf_end= str_ + max_len - 1; // -1: leave space for \0 const char* const buf_end= slider + max_len - 1; // -1: leave space for \0
for (cond= it++; cond && slider < buf_end; cond= it++) for (cond= it++; cond && slider < buf_end; cond= it++)
{ {
...@@ -123,12 +104,17 @@ void wsrep_apply_error::store(const THD* const thd) ...@@ -123,12 +104,17 @@ void wsrep_apply_error::store(const THD* const thd)
err_str, err_code); err_str, err_code);
} }
if (slider != dst.data())
{
*slider= '\0'; *slider= '\0';
len_= slider - str_ + 1; // +1: add \0 slider++;
}
dst.resize(slider - dst.data());
WSREP_DEBUG("Error buffer for thd %llu seqno %lld, %zu bytes: %s", WSREP_DEBUG("Error buffer for thd %llu seqno %lld, %zu bytes: '%s'",
thd->thread_id, (long long)wsrep_thd_trx_seqno(thd), thd->thread_id, (long long)wsrep_thd_trx_seqno(thd),
len_, str_ ? str_ : "(null)"); dst.size(), dst.size() ? dst.data() : "(null)");
} }
int wsrep_apply_events(THD* thd, int wsrep_apply_events(THD* thd,
......
/* Copyright 2013-2015 Codership Oy <http://www.codership.com> /* Copyright 2013-2019 Codership Oy <http://www.codership.com>
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
...@@ -16,16 +16,15 @@ ...@@ -16,16 +16,15 @@
#ifndef WSREP_APPLIER_H #ifndef WSREP_APPLIER_H
#define WSREP_APPLIER_H #define WSREP_APPLIER_H
#include <my_config.h>
#include "sql_class.h" // THD class #include "sql_class.h" // THD class
#include "rpl_rli.h" // Relay_log_info
#include "log_event.h" // Format_description_log_event
int wsrep_apply_events(THD* thd, int wsrep_apply_events(THD* thd,
Relay_log_info* rli, Relay_log_info* rli,
const void* events_buf, const void* events_buf,
size_t buf_len); size_t buf_len);
/* Applier error codes, when nothing better is available. */ /* Applier error codes, when nothing better is available. */
#define WSREP_RET_SUCCESS 0 // Success #define WSREP_RET_SUCCESS 0 // Success
#define WSREP_ERR_GENERIC 1 // When in doubt (MySQL default error code) #define WSREP_ERR_GENERIC 1 // When in doubt (MySQL default error code)
...@@ -36,38 +35,10 @@ int wsrep_apply_events(THD* thd, ...@@ -36,38 +35,10 @@ int wsrep_apply_events(THD* thd,
#define WSREP_ERR_FAILED 6 // Operation failed for some internal reason #define WSREP_ERR_FAILED 6 // Operation failed for some internal reason
#define WSREP_ERR_ABORTED 7 // Operation was aborted externally #define WSREP_ERR_ABORTED 7 // Operation was aborted externally
class wsrep_apply_error void wsrep_store_error(const THD* thd, wsrep::mutable_buffer& buf);
{
public:
wsrep_apply_error() : str_(NULL), len_(0) {};
~wsrep_apply_error() { ::free(str_); }
/* stores the current THD error info from the diagnostic area. Works only
* once, subsequent invocations are ignored in order to preserve the original
* condition. */
void store(const THD* thd);
const char* c_str() const { return str_; }
size_t length() const { return len_; }
bool is_null() const { return (c_str() == NULL && length() == 0); }
wsrep_buf_t get_buf() const
{
wsrep_buf_t ret= { c_str(), length() };
return ret;
}
private:
char* str_;
size_t len_;
};
class Format_description_log_event; class Format_description_log_event;
void wsrep_set_apply_format(THD*, Format_description_log_event*); void wsrep_set_apply_format(THD*, Format_description_log_event*);
Format_description_log_event* wsrep_get_apply_format(THD* thd); Format_description_log_event* wsrep_get_apply_format(THD* thd);
int wsrep_apply(void* ctx,
uint32_t flags,
const wsrep_buf_t* buf,
const wsrep_trx_meta_t* meta,
wsrep_apply_error& err);
wsrep_cb_status_t wsrep_unordered_cb(void* ctx,
const wsrep_buf_t* data);
#endif /* WSREP_APPLIER_H */ #endif /* WSREP_APPLIER_H */
...@@ -417,7 +417,9 @@ void wsrep_register_for_group_commit(THD *thd) ...@@ -417,7 +417,9 @@ void wsrep_register_for_group_commit(THD *thd)
void wsrep_unregister_from_group_commit(THD *thd) void wsrep_unregister_from_group_commit(THD *thd)
{ {
DBUG_ASSERT(thd->wsrep_trx().state() == wsrep::transaction::s_ordered_commit); DBUG_ASSERT(thd->wsrep_trx().state() == wsrep::transaction::s_ordered_commit||
// ordered_commit() failure results in s_aborting state
thd->wsrep_trx().state() == wsrep::transaction::s_aborting);
wait_for_commit *wfc= thd->wait_for_commit_ptr; wait_for_commit *wfc= thd->wait_for_commit_ptr;
if (wfc) if (wfc)
......
...@@ -15,7 +15,6 @@ ...@@ -15,7 +15,6 @@
#include "wsrep_client_service.h" #include "wsrep_client_service.h"
#include "wsrep_high_priority_service.h" #include "wsrep_high_priority_service.h"
#include "wsrep_applier.h" /* wsrep_apply_events() */
#include "wsrep_binlog.h" /* wsrep_dump_rbr_buf() */ #include "wsrep_binlog.h" /* wsrep_dump_rbr_buf() */
#include "wsrep_schema.h" /* remove_fragments() */ #include "wsrep_schema.h" /* remove_fragments() */
#include "wsrep_thd.h" #include "wsrep_thd.h"
......
...@@ -138,3 +138,9 @@ void wsrep_commit_ordered(THD* ) ...@@ -138,3 +138,9 @@ void wsrep_commit_ordered(THD* )
my_bool wsrep_thd_is_applying(const THD*) my_bool wsrep_thd_is_applying(const THD*)
{ return 0;} { return 0;}
my_bool wsrep_thd_has_ignored_error(const THD*)
{ return 0;}
void wsrep_thd_set_ignored_error(THD*, my_bool)
{ }
...@@ -119,6 +119,23 @@ static void wsrep_setup_uk_and_fk_checks(THD* thd) ...@@ -119,6 +119,23 @@ static void wsrep_setup_uk_and_fk_checks(THD* thd)
thd->variables.option_bits&= ~OPTION_NO_FOREIGN_KEY_CHECKS; thd->variables.option_bits&= ~OPTION_NO_FOREIGN_KEY_CHECKS;
} }
static int apply_events(THD* thd,
Relay_log_info* rli,
const wsrep::const_buffer& data,
wsrep::mutable_buffer& err)
{
int const ret= wsrep_apply_events(thd, rli, data.data(), data.size());
if (ret || wsrep_thd_has_ignored_error(thd))
{
if (ret)
{
wsrep_store_error(thd, err);
}
wsrep_dump_rbr_buf_with_header(thd, data.data(), data.size());
}
return ret;
}
/**************************************************************************** /****************************************************************************
High priority service High priority service
*****************************************************************************/ *****************************************************************************/
...@@ -265,8 +282,7 @@ int Wsrep_high_priority_service::append_fragment_and_commit( ...@@ -265,8 +282,7 @@ int Wsrep_high_priority_service::append_fragment_and_commit(
} }
ret= ret || trans_commit(m_thd); ret= ret || trans_commit(m_thd);
ret= ret || (m_thd->wsrep_cs().after_applying(), 0);
m_thd->wsrep_cs().after_applying();
m_thd->mdl_context.release_transactional_locks(); m_thd->mdl_context.release_transactional_locks();
thd_proc_info(m_thd, "wsrep applier committed"); thd_proc_info(m_thd, "wsrep applier committed");
...@@ -335,7 +351,15 @@ int Wsrep_high_priority_service::rollback(const wsrep::ws_handle& ws_handle, ...@@ -335,7 +351,15 @@ int Wsrep_high_priority_service::rollback(const wsrep::ws_handle& ws_handle,
const wsrep::ws_meta& ws_meta) const wsrep::ws_meta& ws_meta)
{ {
DBUG_ENTER("Wsrep_high_priority_service::rollback"); DBUG_ENTER("Wsrep_high_priority_service::rollback");
if (ws_meta.ordered())
{
m_thd->wsrep_cs().prepare_for_ordering(ws_handle, ws_meta, false); m_thd->wsrep_cs().prepare_for_ordering(ws_handle, ws_meta, false);
}
else
{
assert(ws_meta == wsrep::ws_meta());
assert(ws_handle == wsrep::ws_handle());
}
int ret= (trans_rollback_stmt(m_thd) || trans_rollback(m_thd)); int ret= (trans_rollback_stmt(m_thd) || trans_rollback(m_thd));
m_thd->mdl_context.release_transactional_locks(); m_thd->mdl_context.release_transactional_locks();
m_thd->mdl_context.release_explicit_locks(); m_thd->mdl_context.release_explicit_locks();
...@@ -344,7 +368,7 @@ int Wsrep_high_priority_service::rollback(const wsrep::ws_handle& ws_handle, ...@@ -344,7 +368,7 @@ int Wsrep_high_priority_service::rollback(const wsrep::ws_handle& ws_handle,
int Wsrep_high_priority_service::apply_toi(const wsrep::ws_meta& ws_meta, int Wsrep_high_priority_service::apply_toi(const wsrep::ws_meta& ws_meta,
const wsrep::const_buffer& data, const wsrep::const_buffer& data,
wsrep::mutable_buffer&) wsrep::mutable_buffer& err)
{ {
DBUG_ENTER("Wsrep_high_priority_service::apply_toi"); DBUG_ENTER("Wsrep_high_priority_service::apply_toi");
THD* thd= m_thd; THD* thd= m_thd;
...@@ -358,13 +382,8 @@ int Wsrep_high_priority_service::apply_toi(const wsrep::ws_meta& ws_meta, ...@@ -358,13 +382,8 @@ int Wsrep_high_priority_service::apply_toi(const wsrep::ws_meta& ws_meta,
WSREP_DEBUG("Wsrep_high_priority_service::apply_toi: %lld", WSREP_DEBUG("Wsrep_high_priority_service::apply_toi: %lld",
client_state.toi_meta().seqno().get()); client_state.toi_meta().seqno().get());
int ret= wsrep_apply_events(thd, m_rli, data.data(), data.size()); int ret= apply_events(thd, m_rli, data, err);
if (ret != 0 || thd->wsrep_has_ignored_error) wsrep_thd_set_ignored_error(thd, false);
{
wsrep_dump_rbr_buf_with_header(thd, data.data(), data.size());
thd->wsrep_has_ignored_error= false;
/* todo: error voting */
}
trans_commit(thd); trans_commit(thd);
thd->close_temporary_tables(); thd->close_temporary_tables();
...@@ -435,6 +454,11 @@ int Wsrep_high_priority_service::log_dummy_write_set(const wsrep::ws_handle& ws_ ...@@ -435,6 +454,11 @@ int Wsrep_high_priority_service::log_dummy_write_set(const wsrep::ws_handle& ws_
DBUG_RETURN(ret); DBUG_RETURN(ret);
} }
void Wsrep_high_priority_service::adopt_apply_error(wsrep::mutable_buffer& err)
{
m_thd->wsrep_cs().adopt_apply_error(err);
}
void Wsrep_high_priority_service::debug_crash(const char* crash_point) void Wsrep_high_priority_service::debug_crash(const char* crash_point)
{ {
DBUG_ASSERT(m_thd == current_thd); DBUG_ASSERT(m_thd == current_thd);
...@@ -466,7 +490,7 @@ Wsrep_applier_service::~Wsrep_applier_service() ...@@ -466,7 +490,7 @@ Wsrep_applier_service::~Wsrep_applier_service()
int Wsrep_applier_service::apply_write_set(const wsrep::ws_meta& ws_meta, int Wsrep_applier_service::apply_write_set(const wsrep::ws_meta& ws_meta,
const wsrep::const_buffer& data, const wsrep::const_buffer& data,
wsrep::mutable_buffer&) wsrep::mutable_buffer& err)
{ {
DBUG_ENTER("Wsrep_applier_service::apply_write_set"); DBUG_ENTER("Wsrep_applier_service::apply_write_set");
THD* thd= m_thd; THD* thd= m_thd;
...@@ -492,13 +516,7 @@ int Wsrep_applier_service::apply_write_set(const wsrep::ws_meta& ws_meta, ...@@ -492,13 +516,7 @@ int Wsrep_applier_service::apply_write_set(const wsrep::ws_meta& ws_meta,
};); };);
wsrep_setup_uk_and_fk_checks(thd); wsrep_setup_uk_and_fk_checks(thd);
int ret= apply_events(thd, m_rli, data, err);
int ret= wsrep_apply_events(thd, m_rli, data.data(), data.size());
if (ret || thd->wsrep_has_ignored_error)
{
wsrep_dump_rbr_buf_with_header(thd, data.data(), data.size());
}
thd->close_temporary_tables(); thd->close_temporary_tables();
if (!ret && !(ws_meta.flags() & wsrep::provider::flag::commit)) if (!ret && !(ws_meta.flags() & wsrep::provider::flag::commit))
...@@ -621,7 +639,7 @@ Wsrep_replayer_service::~Wsrep_replayer_service() ...@@ -621,7 +639,7 @@ Wsrep_replayer_service::~Wsrep_replayer_service()
int Wsrep_replayer_service::apply_write_set(const wsrep::ws_meta& ws_meta, int Wsrep_replayer_service::apply_write_set(const wsrep::ws_meta& ws_meta,
const wsrep::const_buffer& data, const wsrep::const_buffer& data,
wsrep::mutable_buffer&) wsrep::mutable_buffer& err)
{ {
DBUG_ENTER("Wsrep_replayer_service::apply_write_set"); DBUG_ENTER("Wsrep_replayer_service::apply_write_set");
THD* thd= m_thd; THD* thd= m_thd;
...@@ -640,14 +658,7 @@ int Wsrep_replayer_service::apply_write_set(const wsrep::ws_meta& ws_meta, ...@@ -640,14 +658,7 @@ int Wsrep_replayer_service::apply_write_set(const wsrep::ws_meta& ws_meta,
ws_meta, ws_meta,
thd->wsrep_sr().fragments()); thd->wsrep_sr().fragments());
} }
ret= ret || apply_events(thd, m_rli, data, err);
ret= ret || wsrep_apply_events(thd, m_rli, data.data(), data.size());
if (ret || thd->wsrep_has_ignored_error)
{
wsrep_dump_rbr_buf_with_header(thd, data.data(), data.size());
}
thd->close_temporary_tables(); thd->close_temporary_tables();
if (!ret && !(ws_meta.flags() & wsrep::provider::flag::commit)) if (!ret && !(ws_meta.flags() & wsrep::provider::flag::commit))
{ {
......
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#define WSREP_HIGH_PRIORITY_SERVICE_H #define WSREP_HIGH_PRIORITY_SERVICE_H
#include "wsrep/high_priority_service.hpp" #include "wsrep/high_priority_service.hpp"
#include "wsrep/client_state.hpp"
#include "my_global.h" #include "my_global.h"
#include "sql_error.h" /* Diagnostics area */ #include "sql_error.h" /* Diagnostics area */
#include "sql_class.h" /* rpl_group_info */ #include "sql_class.h" /* rpl_group_info */
...@@ -53,7 +52,7 @@ class Wsrep_high_priority_service : ...@@ -53,7 +52,7 @@ class Wsrep_high_priority_service :
int log_dummy_write_set(const wsrep::ws_handle&, int log_dummy_write_set(const wsrep::ws_handle&,
const wsrep::ws_meta&, const wsrep::ws_meta&,
wsrep::mutable_buffer&); wsrep::mutable_buffer&);
void adopt_apply_error(wsrep::mutable_buffer& err) {} void adopt_apply_error(wsrep::mutable_buffer&);
virtual bool check_exit_status() const = 0; virtual bool check_exit_status() const = 0;
void debug_crash(const char*); void debug_crash(const char*);
...@@ -74,7 +73,7 @@ class Wsrep_high_priority_service : ...@@ -74,7 +73,7 @@ class Wsrep_high_priority_service :
my_hrtime_t user_time; my_hrtime_t user_time;
longlong row_count_func; longlong row_count_func;
bool wsrep_applier; bool wsrep_applier;
} m_shadow; } m_shadow;
}; };
class Wsrep_applier_service : public Wsrep_high_priority_service class Wsrep_applier_service : public Wsrep_high_priority_service
......
...@@ -1800,13 +1800,16 @@ static void wsrep_TOI_begin_failed(THD* thd, const wsrep_buf_t* /* const err */) ...@@ -1800,13 +1800,16 @@ static void wsrep_TOI_begin_failed(THD* thd, const wsrep_buf_t* /* const err */)
if (wsrep_emulate_bin_log) wsrep_thd_binlog_trx_reset(thd); if (wsrep_emulate_bin_log) wsrep_thd_binlog_trx_reset(thd);
if (wsrep_write_dummy_event(thd, "TOI begin failed")) { goto fail; } if (wsrep_write_dummy_event(thd, "TOI begin failed")) { goto fail; }
wsrep::client_state& cs(thd->wsrep_cs()); wsrep::client_state& cs(thd->wsrep_cs());
int const ret= cs.leave_toi_local(wsrep::mutable_buffer()); std::string const err(wsrep::to_c_string(cs.current_error()));
wsrep::mutable_buffer err_buf;
err_buf.push_back(err);
int const ret= cs.leave_toi_local(err_buf);
if (ret) if (ret)
{ {
WSREP_ERROR("Leaving critical section for failed TOI failed: thd: %lld, " WSREP_ERROR("Leaving critical section for failed TOI failed: thd: %lld, "
"schema: %s, SQL: %s, rcode: %d wsrep_error: %s", "schema: %s, SQL: %s, rcode: %d wsrep_error: %s",
(long long)thd->real_id, thd->db.str, (long long)thd->real_id, thd->db.str,
thd->query(), ret, wsrep::to_c_string(cs.current_error())); thd->query(), ret, err.c_str());
goto fail; goto fail;
} }
} }
...@@ -1927,7 +1930,12 @@ static void wsrep_TOI_end(THD *thd) { ...@@ -1927,7 +1930,12 @@ static void wsrep_TOI_end(THD *thd) {
if (wsrep_thd_is_local_toi(thd)) if (wsrep_thd_is_local_toi(thd))
{ {
wsrep_set_SE_checkpoint(client_state.toi_meta().gtid()); wsrep_set_SE_checkpoint(client_state.toi_meta().gtid());
int ret= client_state.leave_toi_local(wsrep::mutable_buffer()); wsrep::mutable_buffer err;
if (thd->is_error() && !wsrep_must_ignore_error(thd))
{
wsrep_store_error(thd, err);
}
int const ret= client_state.leave_toi_local(err);
if (!ret) if (!ret)
{ {
WSREP_DEBUG("TO END: %lld", client_state.toi_meta().seqno().get()); WSREP_DEBUG("TO END: %lld", client_state.toi_meta().seqno().get());
...@@ -2418,7 +2426,7 @@ int wsrep_must_ignore_error(THD* thd) ...@@ -2418,7 +2426,7 @@ int wsrep_must_ignore_error(THD* thd)
const uint flags= sql_command_flags[thd->lex->sql_command]; const uint flags= sql_command_flags[thd->lex->sql_command];
DBUG_ASSERT(error); DBUG_ASSERT(error);
DBUG_ASSERT(wsrep_thd_is_toi(thd) || wsrep_thd_is_applying(thd)); DBUG_ASSERT(wsrep_thd_is_toi(thd));
if ((wsrep_ignore_apply_errors & WSREP_IGNORE_ERRORS_ON_DDL)) if ((wsrep_ignore_apply_errors & WSREP_IGNORE_ERRORS_ON_DDL))
goto ignore_error; goto ignore_error;
......
...@@ -1289,7 +1289,7 @@ int Wsrep_schema::recover_sr_transactions(THD *orig_thd) ...@@ -1289,7 +1289,7 @@ int Wsrep_schema::recover_sr_transactions(THD *orig_thd)
goto out; goto out;
} }
while (true) while (0 == error)
{ {
if ((error= Wsrep_schema_impl::next_record(frag_table)) == 0) if ((error= Wsrep_schema_impl::next_record(frag_table)) == 0)
{ {
...@@ -1344,19 +1344,23 @@ int Wsrep_schema::recover_sr_transactions(THD *orig_thd) ...@@ -1344,19 +1344,23 @@ int Wsrep_schema::recover_sr_transactions(THD *orig_thd)
} }
applier->store_globals(); applier->store_globals();
wsrep::mutable_buffer unused; wsrep::mutable_buffer unused;
applier->apply_write_set(ws_meta, data, unused); if ((ret= applier->apply_write_set(ws_meta, data, unused)) != 0)
{
WSREP_ERROR("SR trx recovery applying returned %d", ret);
}
else
{
applier->after_apply(); applier->after_apply();
}
storage_service.store_globals(); storage_service.store_globals();
} }
else if (error == HA_ERR_END_OF_FILE) else if (error == HA_ERR_END_OF_FILE)
{ {
ret= 0; ret= 0;
break;
} }
else else
{ {
WSREP_ERROR("SR table scan returned error %d", error); WSREP_ERROR("SR table scan returned error %d", error);
break;
} }
} }
Wsrep_schema_impl::end_scan(frag_table); Wsrep_schema_impl::end_scan(frag_table);
......
...@@ -292,9 +292,7 @@ static inline int wsrep_before_commit(THD* thd, bool all) ...@@ -292,9 +292,7 @@ static inline int wsrep_before_commit(THD* thd, bool all)
Return zero on succes, non-zero on failure. Return zero on succes, non-zero on failure.
*/ */
static inline int wsrep_ordered_commit(THD* thd, static inline int wsrep_ordered_commit(THD* thd, bool all)
bool all,
const wsrep_apply_error&)
{ {
DBUG_ENTER("wsrep_ordered_commit"); DBUG_ENTER("wsrep_ordered_commit");
WSREP_DEBUG("wsrep_ordered_commit: %d", wsrep_is_real(thd, all)); WSREP_DEBUG("wsrep_ordered_commit: %d", wsrep_is_real(thd, all));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment