#
# 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

#
# Scenario 2
# The expected recovered seqno is 3 corresponding to two configuration
# changes and CREATE TABLE
#

CREATE TABLE t1 (f1 INT PRIMARY KEY) ENGINE=InnoDB;
let $restart_noprint=2;
--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
# changes, CREATE TABLE and INSERT.
#
# The expected wsrep_last_committed after the server is restarted is 6.
#

INSERT INTO t1 VALUES (5);
let $restart_noprint=2;
--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
#
# The INSERT gets prepared but not committed.
#
# This scenario is not applicable if binlog is not on since the
# commit is not 2PC.
#
# If binlog is on, the INSERT
# should be rolled back during recovery phase since it has not yet
# been logged into binlog.
#
if ($log_bin) {
   --connect con1, localhost, root
   SET DEBUG_SYNC = "ha_commit_trans_after_prepare SIGNAL after_prepare_reached WAIT_FOR continue";
   --send INSERT INTO t1 VALUES (7)

   --connection default
   let $restart_noprint=2;
   SET DEBUG_SYNC = "now WAIT_FOR after_prepare_reached";
   --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
   --echo Expect 5
   SELECT * FROM t1;
}

DROP TABLE t1;
