-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
MDEV-13626: Import and adapt innodb.xa_recovery_debug
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
Showing
2 changed files
with
62 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; |