# # Test that if the gcache rolls over while IST is in progress, IST will still complete. # This is achieved by using the ist_sender_send_after_get_buffers Galera dbug sync point to block the donor after # the first gcache buffer has been locked for IST. # # After IST blocks, we roll over the gcache and resume IST to confirm that it completes successfully. # # Two nodes perform IST at the same time in order to make the test more stressfull # --source include/galera_cluster.inc --source include/have_innodb.inc --source include/have_debug_sync.inc --source include/galera_have_debug_sync.inc --source include/force_restart.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 --connection node_1 --let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' --let $wait_condition_on_error_output = SELECT * FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE 'wsrep%'; show processlist --source include/wait_condition_with_debug.inc CREATE TABLE t1 (f1 INTEGER PRIMARY KEY); INSERT INTO t1 VALUES (01), (02), (03), (04), (05); # Disconnect nodes #2 and #3 --connection node_2 --let $wsrep_cluster_address_orig2 = `select @@wsrep_cluster_address` --source suite/galera/include/galera_stop_replication.inc --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 --connection node_3 --let $wsrep_cluster_address_orig3 = `select @@wsrep_cluster_address` --source suite/galera/include/galera_stop_replication.inc --connection node_1 INSERT INTO t1 VALUES (11), (12), (13), (14), (15); # Wait until nodes #2 and #3 have left --let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' --source include/wait_condition.inc INSERT INTO t1 VALUES (21), (22), (23), (24), (25); # Make sure IST will block ... --let $galera_sync_point = ist_sender_send_after_get_buffers --source include/galera_set_sync_point.inc # ... and restart providers to force IST --connection node_2 --disable_query_log SET GLOBAL wsrep_cluster_address=''; --eval SET GLOBAL wsrep_cluster_address = '$wsrep_cluster_address_orig2'; --enable_query_log --connection node_1 INSERT INTO t1 VALUES (31), (32), (33), (34), (35); --connection node_3 --disable_query_log SET GLOBAL wsrep_cluster_address=''; --eval SET GLOBAL wsrep_cluster_address = '$wsrep_cluster_address_orig3'; --enable_query_log --connection node_1 --sleep 2 SHOW STATUS LIKE 'wsrep_debug_sync_waiters'; INSERT INTO t1 VALUES (41), (42), (43), (44), (45); # Roll over gcache by writing a lot of information to it CREATE TABLE t2 (f1 LONGTEXT); INSERT INTO t2 VALUES (REPEAT('x', 512 * 1024)); INSERT INTO t2 VALUES (REPEAT('x', 512 * 1024)); INSERT INTO t2 VALUES (REPEAT('x', 512 * 1024)); # Unlock IST and wait for it to complete --source include/galera_clear_sync_point.inc --source include/galera_signal_sync_point.inc INSERT INTO t1 VALUES (51), (52), (53), (54), (55); --connection node_2 --source include/wait_until_connected_again.inc --connection node_1 --let $wait_condition = SELECT VARIABLE_VALUE = 2 OR VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' --source include/wait_condition.inc --connection node_3 --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 # Final checks --connection node_2 --let $wait_condition = SELECT COUNT(*) = 30 FROM t1 --source include/wait_condition.inc SELECT COUNT(*) AS EXPECT_30 FROM t1; SELECT COUNT(*) AS EXPECT_3 FROM t2; SELECT LENGTH(f1) = 512 * 1024 FROM t2; CALL mtr.add_suppression("WSREP: Unsupported protocol downgrade: incremental data collection disabled"); # Final checks --connection node_3 --let $wait_condition = SELECT COUNT(*) = 30 FROM t1 --source include/wait_condition.inc SELECT COUNT(*) AS EXPECT_30 FROM t1; SELECT COUNT(*) AS EXPECT_3 FROM t2; SELECT LENGTH(f1) = 512 * 1024 FROM t2; CALL mtr.add_suppression("WSREP: Unsupported protocol downgrade: incremental data collection disabled"); DROP TABLE t1, t2; # Restore original auto_increment_offset values. --let $galera_cluster_size=3 --source ../galera/include/auto_increment_offset_restore.inc --source include/galera_end.inc