Skip to content

Commit

Permalink
MDEV-13626: Import and adapt innodb.xa_recovery_debug
Browse files Browse the repository at this point in the history
Adapt the test that was added in
mysql/mysql-server@6b65d90
but omitted in commit 2e814d4.

Instead of triggering a log checkpoint, we will only trigger
a redo log flush before killing the server.
Note: the mtr.commit() call in trx_rollback_for_mysql()
will not actually make the undo log header page state change durable.
A call to log_write_up_to(mtr.commit_lsn(), true) would do that.

It is unclear what the originally reported bug scenario was.
As long as innobase_rollback_by_xid() will not return without
ensuring that the redo log has been durably written, we should be safe.
  • Loading branch information
dr-m committed Mar 31, 2020
1 parent 2d16452 commit fb21744
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 0 deletions.
27 changes: 27 additions & 0 deletions mysql-test/suite/innodb/r/xa_recovery_debug.result
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#
# Bug#20872655 XA ROLLBACK IS NOT CRASH-SAFE
#
CREATE TABLE t(a INT PRIMARY KEY, b INT UNIQUE) ENGINE=INNODB;
INSERT INTO t SET a=0;
connect con1,localhost,root;
XA START 'zombie';
INSERT INTO t SET a=1;
UPDATE t SET b=1 WHERE a=1;
SELECT COUNT(*) FROM t;
COUNT(*)
2
XA END 'zombie';
XA PREPARE 'zombie';
SET DEBUG_SYNC='trx_xa_rollback SIGNAL s1 WAIT_FOR s2';
XA ROLLBACK 'zombie';
connection default;
SET DEBUG_SYNC='now WAIT_FOR s1';
SET GLOBAL innodb_flush_log_at_trx_commit=1;
DELETE FROM t LIMIT 1;
disconnect con1;
XA COMMIT 'zombie';
ERROR XAE04: XAER_NOTA: Unknown XID
SELECT COUNT(*) FROM t;
COUNT(*)
0
DROP TABLE t;
35 changes: 35 additions & 0 deletions mysql-test/suite/innodb/t/xa_recovery_debug.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
--source include/have_innodb.inc
--source include/have_debug.inc
--source include/have_debug_sync.inc
# Embedded server does not support restarting
--source include/not_embedded.inc

--echo #
--echo # Bug#20872655 XA ROLLBACK IS NOT CRASH-SAFE
--echo #

CREATE TABLE t(a INT PRIMARY KEY, b INT UNIQUE) ENGINE=INNODB;
INSERT INTO t SET a=0;
connect (con1,localhost,root);
XA START 'zombie';
INSERT INTO t SET a=1;
UPDATE t SET b=1 WHERE a=1;
SELECT COUNT(*) FROM t;
XA END 'zombie';
XA PREPARE 'zombie';
SET DEBUG_SYNC='trx_xa_rollback SIGNAL s1 WAIT_FOR s2';
--send XA ROLLBACK 'zombie'
connection default;
SET DEBUG_SYNC='now WAIT_FOR s1';
# Ensure that the state change from XA PREPARE to ACTIVE gets flushed
# to the redo log. Without this, it could be that we will recover to
# a state that precedes the start of the XA ROLLBACK.
SET GLOBAL innodb_flush_log_at_trx_commit=1;
DELETE FROM t LIMIT 1;
let $shutdown_timeout=0;
--source include/restart_mysqld.inc
disconnect con1;
--error ER_XAER_NOTA
XA COMMIT 'zombie';
SELECT COUNT(*) FROM t;
DROP TABLE t;

0 comments on commit fb21744

Please sign in to comment.