MTR tests to test Galera fix for node joining over several configuration

changes.

This requires Galera commit 065e484144c5999709ae8fd19844da72bb785073
This commit is contained in:
Alexey Yurchenko 2020-04-29 13:41:46 +03:00 committed by Jan Lindström
parent e0793d3865
commit 8e58eeba78
6 changed files with 979 additions and 0 deletions

View File

@ -0,0 +1,40 @@
CREATE TABLE t1 (pk INT PRIMARY KEY, node INT) ENGINE=innodb;
INSERT INTO t1 VALUES (1, 1);
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
INSERT INTO t1 VALUES (2, 3);
SET wsrep_sync_wait = 0;
SET wsrep_on = OFF;
SET GLOBAL wsrep_provider_options = 'dbug=d,after_shift_to_joining';
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
INSERT INTO t1 VALUES (3, 2);
SET SESSION wsrep_on = 0;
SET SESSION wsrep_on = 0;
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
INSERT INTO t1 VALUES (4, 3);
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
INSERT INTO t1 VALUES (5, 2);
SET GLOBAL wsrep_provider_options = 'dbug=d,before_send_state_request';
SET GLOBAL wsrep_provider_options = 'signal=after_shift_to_joining';
SET SESSION wsrep_on = 0;
SET SESSION wsrep_on = 0;
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
INSERT INTO t1 VALUES (6, 3);
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
INSERT INTO t1 VALUES (7, 2);
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
INSERT INTO t1 VALUES (8, 3);
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
SET GLOBAL wsrep_provider_options = 'dbug=d,process_primary_configuration';
SET GLOBAL wsrep_provider_options = 'signal=before_send_state_request';
SET SESSION wsrep_on = 0;
SET SESSION wsrep_on = 0;
INSERT INTO t1 VALUES (9, 2);
SET GLOBAL wsrep_provider_options = 'signal=process_primary_configuration';
SET SESSION wsrep_on = 0;
SET SESSION wsrep_on = 0;
SET GLOBAL wsrep_provider_options = 'signal=process_primary_configuration';
SET GLOBAL wsrep_provider_options = 'dbug=';
DROP TABLE t1;
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");

View File

@ -0,0 +1,50 @@
CREATE TABLE t1 (pk INT PRIMARY KEY, node INT) ENGINE=innodb;
INSERT INTO t1 VALUES (1, 1);
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
INSERT INTO t1 VALUES (2, 3);
SET wsrep_sync_wait = 0;
SET wsrep_on = OFF;
SET GLOBAL wsrep_provider_options = 'dbug=d,after_shift_to_joining';
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
INSERT INTO t1 VALUES (3, 2);
SET SESSION wsrep_on = 0;
SET SESSION wsrep_on = 0;
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
INSERT INTO t1 VALUES (4, 3);
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
INSERT INTO t1 VALUES (5, 2);
SET GLOBAL wsrep_provider_options = 'dbug=d,before_send_state_request';
SET GLOBAL wsrep_provider_options = 'signal=after_shift_to_joining';
SET SESSION wsrep_on = 0;
SET SESSION wsrep_on = 0;
SET GLOBAL wsrep_provider_options = 'dbug=';
SET GLOBAL wsrep_provider_options = 'signal=before_send_state_request';
SET SESSION wsrep_on = 0;
SET SESSION wsrep_on = 0;
SELECT * FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_debug_sync_waiters';
VARIABLE_NAME VARIABLE_VALUE
WSREP_DEBUG_SYNC_WAITERS after_shift_to_joining
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
INSERT INTO t1 VALUES (6, 3);
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
INSERT INTO t1 VALUES (7, 2);
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
INSERT INTO t1 VALUES (8, 3);
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
SET GLOBAL wsrep_provider_options = 'dbug=d,process_primary_configuration';
SET GLOBAL wsrep_provider_options = 'signal=after_shift_to_joining';
SET SESSION wsrep_on = 0;
SET SESSION wsrep_on = 0;
INSERT INTO t1 VALUES (9, 2);
SET GLOBAL wsrep_provider_options = 'signal=process_primary_configuration';
SET SESSION wsrep_on = 0;
SET SESSION wsrep_on = 0;
SELECT * FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_debug_sync_waiters';
VARIABLE_NAME VARIABLE_VALUE
WSREP_DEBUG_SYNC_WAITERS process_primary_configuration
SET GLOBAL wsrep_provider_options = 'signal=process_primary_configuration';
SET GLOBAL wsrep_provider_options = 'dbug=';
DROP TABLE t1;
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");

View File

@ -0,0 +1,55 @@
CREATE TABLE t1 (pk INT PRIMARY KEY, node INT) ENGINE=innodb;
INSERT INTO t1 VALUES (1, 1);
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
INSERT INTO t1 VALUES (2, 3);
SET wsrep_sync_wait = 0;
SET wsrep_on = OFF;
SET GLOBAL wsrep_provider_options = 'dbug=d,after_shift_to_joining';
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
INSERT INTO t1 VALUES (3, 2);
SET SESSION wsrep_on = 0;
SET SESSION wsrep_on = 0;
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
INSERT INTO t1 VALUES (4, 3);
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
INSERT INTO t1 VALUES (5, 2);
SET GLOBAL wsrep_provider_options = 'dbug=d,before_send_state_request';
SET GLOBAL wsrep_provider_options = 'signal=after_shift_to_joining';
SET SESSION wsrep_on = 0;
SET SESSION wsrep_on = 0;
SET GLOBAL wsrep_provider_options = 'dbug=';
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
SET GLOBAL wsrep_provider_options = 'dbug=d,after_shift_to_joining';
SET GLOBAL wsrep_provider_options = 'signal=before_send_state_request';
4
SELECT * FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_debug_sync_waiters';
VARIABLE_NAME VARIABLE_VALUE
WSREP_DEBUG_SYNC_WAITERS
INSERT INTO t1 VALUES (6, 3);
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
INSERT INTO t1 VALUES (7, 2);
SET SESSION wsrep_on = 0;
SET SESSION wsrep_on = 0;
SET GLOBAL wsrep_provider_options = 'dbug=';
SET GLOBAL wsrep_provider_options = 'dbug=d,process_primary_configuration';
SET GLOBAL wsrep_provider_options = 'signal=after_shift_to_joining';
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
INSERT INTO t1 VALUES (8, 3);
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
SET SESSION wsrep_on = 0;
SET SESSION wsrep_on = 0;
INSERT INTO t1 VALUES (9, 2);
SET GLOBAL wsrep_provider_options = 'signal=process_primary_configuration';
SET SESSION wsrep_on = 0;
SET SESSION wsrep_on = 0;
SET GLOBAL wsrep_provider_options = 'dbug=';
SET GLOBAL wsrep_provider_options = 'signal=process_primary_configuration';
SET SESSION wsrep_on = 0;
SET SESSION wsrep_on = 0;
SET GLOBAL wsrep_provider_options = 'dbug=';
SET GLOBAL wsrep_provider_options = 'signal=after_shift_to_joining';
DROP TABLE t1;
call mtr.add_suppression("WSREP: Send action {\(.*\), STATE_REQUEST} returned -107 \\(Transport endpoint is not connected\\)");
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");

View File

@ -0,0 +1,262 @@
#
# Tests handling of several configuration changes while a joiner gets
# state transfer
#
# Variant A: sending of state transfer request delayed until two more
# primary configuration changes happen
#
# Refs codersihp/galera-bugs#454
#
--source include/have_innodb.inc
--source include/galera_cluster.inc
--source suite/galera/include/galera_have_debug_sync.inc
--let $galera_connection_name = node_3
--let $galera_server_number = 3
--source include/galera_connect.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
CREATE TABLE t1 (pk INT PRIMARY KEY, node INT) ENGINE=innodb;
INSERT INTO t1 VALUES (1, 1);
--connection node_2
--let $wait_condition = SELECT COUNT(*) = 1 FROM t1;
--source include/wait_condition.inc
#
# Isolate node_1 and update cluster state to force node 1 into joiner mode
#
--connection node_1
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
--connection node_2
--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
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
INSERT INTO t1 VALUES (2, 3);
--connection node_2
--let $wait_condition = SELECT COUNT(*) = 2 FROM t1;
--source include/wait_condition.inc
#
# Now reconnect node_1 but first make it block before sending state transfer
# request
#
# THIS IS PC1
#
--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1
SET wsrep_sync_wait = 0;
SET wsrep_on = OFF;
--let $galera_sync_point = after_shift_to_joining
--source include/galera_set_sync_point.inc
--connection node_1
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
--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
INSERT INTO t1 VALUES (3, 2);
--connection node_1a
--source include/galera_wait_sync_point.inc
#
# At this point every node thinks that node_1 is in a JOINER state
#
--connection node_3
--let $wait_condition = SELECT COUNT(*) = 3 FROM t1;
--source include/wait_condition.inc
#
# Now that node_1 sent state request and became JOINER isolate node_1 again
# and commit one more action, so that node_1 loses JOINER state
#
--connection node_1
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
--connection node_2
--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
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
INSERT INTO t1 VALUES (4, 3);
--connection node_2
--let $wait_condition = SELECT COUNT(*) = 4 FROM t1;
--source include/wait_condition.inc
#
# Reconnect node_1 again
#
# THIS IS PC2
#
--connection node_1
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
--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
#
# After this point node_1 is no longer JOINER and is required to start the
# whole procedure over because it missed some actions (4th insert into t1)
#
INSERT INTO t1 VALUES (5, 2);
--connection node_3
--let $wait_condition = SELECT COUNT(*) = 5 FROM t1;
--source include/wait_condition.inc
#
# Now let node_1 continue with IST and finish processing PC1, but make it
# block when processing PC2 just before sending state transfer request
#
--connection node_1a
--let $galera_sync_point = before_send_state_request
--source include/galera_set_sync_point.inc
--let $galera_sync_point = after_shift_to_joining
--source include/galera_signal_sync_point.inc
--let $galera_sync_point = before_send_state_request
--source include/galera_wait_sync_point.inc
# since PC1 has been processed node_1 must have 3 rows in t1
# 2 were there before PC1 and one was added while in PC1
--let $wait_condition = SELECT COUNT(*) = 3 FROM t1;
--source include/wait_condition.inc
#
# Now disconnect and reconnect node_1 again to get PC3
# It still is blocked before sending state transfer request in PC2.
#
--connection node_1
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
--connection node_2
--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
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
INSERT INTO t1 VALUES (6, 3);
--connection node_2
--let $wait_condition = SELECT COUNT(*) = 6 FROM t1;
--source include/wait_condition.inc
--connection node_1
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
--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
#
# This is PC3
#
INSERT INTO t1 VALUES (7, 2);
--connection node_3
--let $wait_condition = SELECT COUNT(*) = 7 FROM t1;
--source include/wait_condition.inc
#
# Now disconnect and reconnect node_1 again to get PC4 and allow node_1
# to send state transfer request to be delivered in PC4 (and thus get
# updated to PC4 seqno in state transfer.
# Note that node_1 still processes PC2.
#
--connection node_1
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
--connection node_2
--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
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
INSERT INTO t1 VALUES (8, 3);
--connection node_2
--let $wait_condition = SELECT COUNT(*) = 8 FROM t1;
--source include/wait_condition.inc
--connection node_1
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
--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
#
# This is PC4. node_1 is still processing PC2, waiting to send state trasfer
# request
#
--connection node_1a
--let $galera_sync_point = process_primary_configuration
--source include/galera_set_sync_point.inc
--let $galera_sync_point = before_send_state_request
--source include/galera_signal_sync_point.inc
# sent STR from PC2 into PC4
--let $galera_sync_point = process_primary_configuration
--source include/galera_wait_sync_point.inc
#
# Now node_1 is processing PC3, but should have completed state transfer from
# PC4 and thus must have 8 rows in t1
#
--let $wait_condition = SELECT COUNT(*) = 8 FROM t1;
--source include/wait_condition.inc
--connection node_2
INSERT INTO t1 VALUES (9, 2);
--connection node_3
--let $wait_condition = SELECT COUNT(*) = 9 FROM t1;
--source include/wait_condition.inc
--connection node_1a
#--let $galera_sync_point = process_primary_configuration
--source include/galera_signal_sync_point.inc
--source include/galera_wait_sync_point.inc
#
# Now node_1 is processing PC4, still must have 8 rows in t1
#
--let $wait_condition = SELECT COUNT(*) = 8 FROM t1;
--source include/wait_condition.inc
#--let $galera_sync_point = process_primary_configuration
--source include/galera_signal_sync_point.inc
--source include/galera_clear_sync_point.inc
--let $wait_condition = SELECT COUNT(*) = 9 FROM t1;
--source include/wait_condition.inc
--connection node_1
--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
--source include/wait_condition.inc
DROP TABLE t1;
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
--connection node_2
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
--connection node_3
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");

View File

@ -0,0 +1,273 @@
#
# Tests handling of several configuration changes while a joiner gets
# state transfer
#
# Variant B: sending of state transfer request is immediate but completion
# of IST delayed until two more primary configuration changes happen
#
# Refs codersihp/galera-bugs#454
#
--source include/have_innodb.inc
--source include/galera_cluster.inc
--source suite/galera/include/galera_have_debug_sync.inc
--let $galera_connection_name = node_3
--let $galera_server_number = 3
--source include/galera_connect.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
CREATE TABLE t1 (pk INT PRIMARY KEY, node INT) ENGINE=innodb;
INSERT INTO t1 VALUES (1, 1);
--connection node_2
--let $wait_condition = SELECT COUNT(*) = 1 FROM t1;
--source include/wait_condition.inc
#
# Isolate node_1 and update cluster state to force node 1 into joiner mode
#
--connection node_1
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
--connection node_2
--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
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
INSERT INTO t1 VALUES (2, 3);
--connection node_2
--let $wait_condition = SELECT COUNT(*) = 2 FROM t1;
--source include/wait_condition.inc
#
# Now reconnect node_1 but first make it block before sending state transfer
# request
#
# THIS IS PC1
#
--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1
SET wsrep_sync_wait = 0;
SET wsrep_on = OFF;
--let $galera_sync_point = after_shift_to_joining
--source include/galera_set_sync_point.inc
--connection node_1
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
--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
INSERT INTO t1 VALUES (3, 2);
--connection node_1a
--source include/galera_wait_sync_point.inc
#
# At this point every node thinks that node_1 is in a JOINER state
#
--connection node_3
--let $wait_condition = SELECT COUNT(*) = 3 FROM t1;
--source include/wait_condition.inc
#
# Now that node_1 sent state request and became JOINER isolate node_1 again
# and commit one more action, so that node_1 loses JOINER state
#
--connection node_1
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
--connection node_2
--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
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
INSERT INTO t1 VALUES (4, 3);
--connection node_2
--let $wait_condition = SELECT COUNT(*) = 4 FROM t1;
--source include/wait_condition.inc
#
# Reconnect node_1 again
#
# THIS IS PC2
#
--connection node_1
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
--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
#
# After this point node_1 is no longer JOINER and is required to start the
# whole procedure over because it missed some actions (4th insert into t1)
#
INSERT INTO t1 VALUES (5, 2);
--connection node_3
--let $wait_condition = SELECT COUNT(*) = 5 FROM t1;
--source include/wait_condition.inc
#
# Now let node_1 continue with IST and finish processing PC1, but make it
# block when processing PC2 right after progressing to JOINER state and
# before IST happens.
#
--connection node_1a
--let $galera_sync_point = before_send_state_request
--source include/galera_set_sync_point.inc
--let $galera_sync_point = after_shift_to_joining
--source include/galera_signal_sync_point.inc
--let $galera_sync_point = before_send_state_request
--source include/galera_wait_sync_point.inc
--source include/galera_clear_sync_point.inc
# Here node_1 is processing PC2 just before sending state request
# since PC1 has been processed node_1 must have 3 rows in t1
# 2 were there before PC1 and one was added while in PC1
--let $wait_condition = SELECT COUNT(*) = 3 FROM t1;
--source include/wait_condition.inc
# Proceed to sending state transfer request and block right after
--source include/galera_signal_sync_point.inc # before_send_state_request
--let $galera_sync_point = after_shift_to_joining
--source include/galera_wait_sync_point.inc
SELECT * FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_debug_sync_waiters';
#
# Now disconnect and reconnect node_1 again to get PC3
# It is blocked right after shifting to JOINING state.
#
--connection node_1
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
--connection node_2
--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
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
INSERT INTO t1 VALUES (6, 3);
--connection node_2
--let $wait_condition = SELECT COUNT(*) = 6 FROM t1;
--source include/wait_condition.inc
--connection node_1
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
--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
#
# This is PC3
#
INSERT INTO t1 VALUES (7, 2);
--connection node_3
--let $wait_condition = SELECT COUNT(*) = 7 FROM t1;
--source include/wait_condition.inc
#
# Now disconnect and reconnect node_1 again to get PC4 and allow node_1
# to continue with IST.
# Note that node_1 still processes PC2 and is joining.
#
--connection node_1
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
--connection node_2
--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
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
INSERT INTO t1 VALUES (8, 3);
--connection node_2
--let $wait_condition = SELECT COUNT(*) = 8 FROM t1;
--source include/wait_condition.inc
--connection node_1
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
--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
#
# This is PC4. node_1 is still processing PC2, waiting to send state trasfer
# request
#
--connection node_1a
--let $galera_sync_point = process_primary_configuration
--source include/galera_set_sync_point.inc
--let $galera_sync_point = after_shift_to_joining
--source include/galera_signal_sync_point.inc
# continue with IST prepared for in PC2
--let $galera_sync_point = process_primary_configuration
--source include/galera_wait_sync_point.inc
#
# Now node_1 is processing PC3, and should have finished state transfer
# State tranfer request was dilivered before PC3, so node_1 should have
# received IST up to 4 rows in t1 (what was there before PC2) plus one more
# INSERT while in PC2.
#
--let $wait_condition = SELECT COUNT(*) = 5 FROM t1;
--source include/wait_condition.inc
--connection node_2
INSERT INTO t1 VALUES (9, 2);
--connection node_3
--let $wait_condition = SELECT COUNT(*) = 9 FROM t1;
--source include/wait_condition.inc
--connection node_1a
#--let $galera_sync_point = process_primary_configuration
--source include/galera_signal_sync_point.inc
--source include/galera_wait_sync_point.inc
SELECT * FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_debug_sync_waiters';
#
# Now node_1 is processing PC4, still must have 8 rows in t1
#
--let $wait_condition = SELECT COUNT(*) = 8 FROM t1;
--source include/wait_condition.inc
#--let $galera_sync_point = process_primary_configuration
--source include/galera_signal_sync_point.inc
--source include/galera_clear_sync_point.inc
--let $wait_condition = SELECT COUNT(*) = 9 FROM t1;
--source include/wait_condition.inc
--connection node_1
--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
--source include/wait_condition.inc
DROP TABLE t1;
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
--connection node_2
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
--connection node_3
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");

View File

@ -0,0 +1,299 @@
#
# Tests handling of several configuration changes while a joiner gets
# state transfer
#
# Variant C: sending of state transfer request is scheduled while in non-PRIM
#
# Refs codersihp/galera-bugs#454
#
--source include/have_innodb.inc
--source include/galera_cluster.inc
--source suite/galera/include/galera_have_debug_sync.inc
--let $galera_connection_name = node_3
--let $galera_server_number = 3
--source include/galera_connect.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
CREATE TABLE t1 (pk INT PRIMARY KEY, node INT) ENGINE=innodb;
INSERT INTO t1 VALUES (1, 1);
--connection node_2
--let $wait_condition = SELECT COUNT(*) = 1 FROM t1;
--source include/wait_condition.inc
#
# Isolate node_1 and update cluster state to force node 1 into joiner mode
#
--connection node_1
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
--connection node_2
--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
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
INSERT INTO t1 VALUES (2, 3);
--connection node_2
--let $wait_condition = SELECT COUNT(*) = 2 FROM t1;
--source include/wait_condition.inc
#
# Now reconnect node_1 but first make it block before sending state transfer
# request
#
# THIS IS PC1
#
--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1
SET wsrep_sync_wait = 0;
SET wsrep_on = OFF;
--let $galera_sync_point = after_shift_to_joining
--source include/galera_set_sync_point.inc
--connection node_1
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
--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
INSERT INTO t1 VALUES (3, 2);
--connection node_1a
--source include/galera_wait_sync_point.inc
#
# At this point every node thinks that node_1 is in a JOINER state
#
--connection node_3
--let $wait_condition = SELECT COUNT(*) = 3 FROM t1;
--source include/wait_condition.inc
#
# Now that node_1 sent state request and became JOINER isolate node_1 again
# and commit one more action, so that node_1 loses JOINER state
#
--connection node_1
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
--connection node_2
--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
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
INSERT INTO t1 VALUES (4, 3);
--connection node_2
--let $wait_condition = SELECT COUNT(*) = 4 FROM t1;
--source include/wait_condition.inc
#
# Reconnect node_1 again
#
# THIS IS PC2
#
--connection node_1
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
--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
#
# After this point node_1 is no longer JOINER and is required to start the
# whole procedure over because it missed some actions (4th insert into t1)
#
INSERT INTO t1 VALUES (5, 2);
--connection node_3
--let $wait_condition = SELECT COUNT(*) = 5 FROM t1;
--source include/wait_condition.inc
#
# Now let node_1 continue with IST and finish processing PC1, but make it
# block when processing PC2 right after progressing to JOINER state and
# before IST happens.
#
--connection node_1a
--let $galera_sync_point = before_send_state_request
--source include/galera_set_sync_point.inc
--let $galera_sync_point = after_shift_to_joining
--source include/galera_signal_sync_point.inc
--let $galera_sync_point = before_send_state_request
--source include/galera_wait_sync_point.inc
--source include/galera_clear_sync_point.inc
# Here we are processing PC2 just before sending state request
# since PC1 has been processed node_1 must have 3 rows in t1
# 2 were there before PC1 and one was added while in PC1
--let $wait_condition = SELECT COUNT(*) = 3 FROM t1;
--source include/wait_condition.inc
#
# Now disconnect and reconnect node_1 again to get PC3
# It still is blocked before sending state transfer request in PC2.
#
--connection node_1
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
--connection node_2
--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
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
# Proceed to sending state transfer request
--connection node_1a
--let $galera_sync_point = after_shift_to_joining
--source include/galera_set_sync_point.inc
--let $galera_sync_point = before_send_state_request
--source include/galera_signal_sync_point.inc # before_send_state_request
#
# node_1 proceeds to sending state transfer request, it will be delivered only
# in the next PC which is PC3. Only then the node will shift to JOINING
#
--echo 4
SELECT * FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_debug_sync_waiters';
--connection node_3
INSERT INTO t1 VALUES (6, 3);
--connection node_2
--let $wait_condition = SELECT COUNT(*) = 6 FROM t1;
--source include/wait_condition.inc
--connection node_1
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
--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
#
# This is PC3
#
INSERT INTO t1 VALUES (7, 2);
--connection node_3
--let $wait_condition = SELECT COUNT(*) = 7 FROM t1;
--source include/wait_condition.inc
# node_1 is stiil processing PC2, it was let to send state transfer request
# while in non-PRIM. Now it should be able to complete it and shift to
# JOINING. Make it block on next PC(3) and continue to receive IST
--connection node_1a
--let $galera_sync_point = after_shift_to_joining
--source include/galera_wait_sync_point.inc
--source include/galera_clear_sync_point.inc # won't need it any more
--let $galera_sync_point = process_primary_configuration
--source include/galera_set_sync_point.inc
--let $galera_sync_point = after_shift_to_joining
--source include/galera_signal_sync_point.inc
# continue with IST while still processing PC2
#
# Now disconnect and reconnect node_1 again to generate PC4.
#
--connection node_1
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
--connection node_2
--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
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
INSERT INTO t1 VALUES (8, 3);
--connection node_2
--let $wait_condition = SELECT COUNT(*) = 8 FROM t1;
--source include/wait_condition.inc
--connection node_1
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
--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
#
# This is PC4. node_1 should complete IST, complete PC2, and continue
# with the next item in queue
#
--connection node_1a
--let $galera_sync_point = process_primary_configuration
--source include/galera_wait_sync_point.inc
#
# Now node_1 is blocked before processing PC3, and should have finished state
# transfer started while in PC2.
# State tranfer request was dilivered in PC3 to donor, so node_1 should have
# received IST up to 6 rows in t1 (what was there before PC3).
#
--let $wait_condition = SELECT COUNT(*) = 6 FROM t1;
--source include/wait_condition.inc
--connection node_2
INSERT INTO t1 VALUES (9, 2);
--connection node_3
--let $wait_condition = SELECT COUNT(*) = 9 FROM t1;
--source include/wait_condition.inc
--connection node_1a
# continue with processing PC3
--let $galera_sync_point = process_primary_configuration
--source include/galera_signal_sync_point.inc
# wait for row that follows PC3
--let $wait_condition = SELECT COUNT(*) = 7 FROM t1;
--source include/wait_condition.inc
# wait till PC4
--let $galera_sync_point = process_primary_configuration
--source include/galera_wait_sync_point.inc
#
# Now node_1 is processing PC4, still must have 7 rows in t1
#
--let $wait_condition = SELECT COUNT(*) = 7 FROM t1;
--source include/wait_condition.inc
# Continue with PC4
--let $galera_sync_point = process_primary_configuration
--source include/galera_clear_sync_point.inc
--source include/galera_signal_sync_point.inc
--let $galera_sync_point = after_shift_to_joining
--source include/galera_wait_sync_point.inc
--source include/galera_clear_sync_point.inc
--source include/galera_signal_sync_point.inc
--let $wait_condition = SELECT COUNT(*) = 9 FROM t1;
--source include/wait_condition.inc
--connection node_1
--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
--source include/wait_condition.inc
DROP TABLE t1;
call mtr.add_suppression("WSREP: Send action {\(.*\), STATE_REQUEST} returned -107 \\(Transport endpoint is not connected\\)");
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
--connection node_2
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
--connection node_3
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");