mirror of
https://github.com/MariaDB/server.git
synced 2025-01-30 10:31:54 +01:00
e10f9e6c81
after commit b5615eff0d
194 lines
6.4 KiB
Text
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;
|