mariadb/mysql-test/suite/wsrep/t/wsrep-recover.test

194 lines
6.4 KiB
Text

#
# 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.
#
let $restart_noprint=2;
--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.
#
let $restart_noprint=2;
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.
#
let $restart_noprint=2;
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
let $restart_noprint=2;
--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 transactions will be recovered from InnoDB but
# will be rolled back:
# - If binlog is on, the binlog acts as a transaction coordinator.
# The transaction is not logged into binlog, so the transaction is rolled
# back.
# - If binlog is not on, the transaction is 1PC and the wsrep XID
# is not persisted before commit is complete.
#
--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
let $restart_noprint=2;
--source include/kill_mysqld.inc
--source wsrep-recover-step.inc
--echo Expect seqno 7
--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 8` FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed';
#
# Final sanity check: The successful inserts into t1 should result single row
#
--echo Expect row 5
SELECT * FROM t1;
DROP TABLE t1;