# # Verify that the wsrep XID gets updated in InnoDB rollback segment # properly and can be recovered with --wsrep-recover # # The test runs the following scenarios: # # 1) The server is started but no SQL is run # 2) DDL is executed # 3) INSERT is executed # 4) Two INSERTs are executed so that the first one in order will be # blocked after certification and the second one before entering # commit order critical section. # 5) Two DMLs are executed so that the prepare step is run out of order. # Both transactions are blocked before commit order critical section. # # After each scenario server is killed and the recovered position # is validated. # --source include/have_wsrep.inc --source include/have_innodb.inc --source include/have_wsrep_provider.inc --source include/have_debug_sync.inc # # Binlog option for recovery run. This must be set in the test because # combinations file causes log-bin option to be set from command line, # not via my.cnf. # --let $log_bin = `SELECT @@log_bin` if ($log_bin) { --let $wsrep_recover_binlog_opt = --log-bin } # # Scenario 1 # The expected recovered seqno is 1 corresponding to initial cluster # configuration change. # --source include/kill_mysqld.inc --source wsrep-recover-step.inc --echo Expect seqno 1 --echo $wsrep_recover_start_position_seqno --let $restart_parameters = --wsrep-start-position=$wsrep_recover_start_position_uuid:$wsrep_recover_start_position_seqno --source include/start_mysqld.inc --source include/wait_wsrep_ready.inc # # Senario 2 # The expected recovered seqno is 3 corresponding to two configuration # change events and CREATE TABLE. # CREATE TABLE t1 (f1 INT PRIMARY KEY) ENGINE=InnoDB; --source include/kill_mysqld.inc --source wsrep-recover-step.inc --echo Expect seqno 3 --echo $wsrep_recover_start_position_seqno --let $restart_parameters = --wsrep-start-position=$wsrep_recover_start_position_uuid:$wsrep_recover_start_position_seqno --source include/start_mysqld.inc --source include/wait_wsrep_ready.inc # # Scenario 3 # The expected recovered seqno is 5 corresponding to three configuration # change events, CREATE TABLE and INSERT. # # The expected wsrep_last_committed after the server is restarted is 6. # INSERT INTO t1 VALUES (5); --source include/kill_mysqld.inc --source wsrep-recover-step.inc --echo Expect seqno 5 --echo $wsrep_recover_start_position_seqno --let $restart_parameters = --wsrep-start-position=$wsrep_recover_start_position_uuid:$wsrep_recover_start_position_seqno --source include/start_mysqld.inc --source include/wait_wsrep_ready.inc SELECT VARIABLE_VALUE `expect 6` FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'; # # Scenario 4 # # This will cause the following # # Seqno 7 - the first INSERT is blocked after it is certified but before # it gets prepared # Seqno 8 - the second INSERT is blocked before it will be ordered for # commit, so it becomes prepared # # As an outcome, the recovery process should return seqno 6 because # the range of prepared transactions found after the crash recovery # is not continuous up to 8. # # The expected wsrep_last_committed after server is restarted is 7. # # Send INSERT which will block after certification --connect con1, localhost, root SET DEBUG_SYNC = "wsrep_after_certification SIGNAL after_certification_reached WAIT_FOR continue"; --send INSERT INTO t1 VALUES (7) --connect con_ctrl, localhost, root SET DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; # Send INSERT which will block before commit order critical section --connect con2, localhost, root SET DEBUG_SYNC = "wsrep_before_commit_order_enter SIGNAL before_commit_order_reached WAIT_FOR continue"; --send INSERT INTO t1 VALUES (8) --connection con_ctrl SET DEBUG_SYNC = "now WAIT_FOR before_commit_order_reached"; --connection default --source include/kill_mysqld.inc --source wsrep-recover-step.inc --echo Expect seqno 6 --echo $wsrep_recover_start_position_seqno --let $restart_parameters = --wsrep-start-position=$wsrep_recover_start_position_uuid:$wsrep_recover_start_position_seqno --source include/start_mysqld.inc --source include/wait_wsrep_ready.inc --disconnect con1 --disconnect con2 --disconnect con_ctrl --connection default SELECT VARIABLE_VALUE `expect 7` FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'; # # Scenario 5 # # This scenario will run two INSERTs in parallel so that they are # prepared out of order. The execution is stopped before commit # and the server is killed. The outcome of this scenario depends # on binlog settings: # # If binlog is off, the transactions will be recovered from InnoDB and # committed during recovery. The expected recovered seqno is 9, the # expected wsrep_last_committed after server is restarted is 10. # # If binlog is on, the transactions will be recovered from InnoDB but # will be rolled back since they are not logged yet in binlog. The # expected recovered seqno is 7, the expected wsrep_last_committed # after server is restarted is 8. # --connect con1, localhost, root SET DEBUG_SYNC = "wsrep_after_certification SIGNAL after_certification_reached WAIT_FOR continue_after_certification"; SET DEBUG_SYNC = "wsrep_before_commit_order_enter SIGNAL before_commit_order_reached_1 WAIT_FOR continue_before_commit_order_1"; --send INSERT INTO t1 VALUES (9) --connect con_ctrl, localhost, root SET DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; --connect con2, localhost, root SET DEBUG_SYNC = "wsrep_before_commit_order_enter SIGNAL before_commit_order_reached_2 WAIT_FOR continue_before_commit_order_2"; --send INSERT INTO t1 VALUES (10) --connection con_ctrl SET DEBUG_SYNC = "now WAIT_FOR before_commit_order_reached_2"; SET DEBUG_SYNC = "now SIGNAL continue_after_certification"; SET DEBUG_SYNC = "now WAIT_FOR before_commit_order_reached_1"; --connection default --source include/kill_mysqld.inc --source wsrep-recover-step.inc if ($log_bin) { --echo Expect seqno 7 } if (!$log_bin) { --echo Expect seqno 9 } --echo $wsrep_recover_start_position_seqno --let $restart_parameters = --wsrep-start-position=$wsrep_recover_start_position_uuid:$wsrep_recover_start_position_seqno --source include/start_mysqld.inc --source include/wait_wsrep_ready.inc --disconnect con1 --disconnect con2 --disconnect con_ctrl --connection default if ($log_bin) { SELECT VARIABLE_VALUE `expect 8` FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'; } if (!$log_bin) { SELECT VARIABLE_VALUE `expect 10` FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'; } # # Final sanity check: The successful inserts into t1 should result if ($log_bin) { --echo Expect row 5 } if (!$log_bin) { --echo Expect rows 5, 9, 10 } SELECT * FROM t1; DROP TABLE t1;