mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 02:46:29 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			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;
 | 
