Permalink
Show file tree
Hide file tree
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
MDEV-14988 innodb_read_only tries to modify files if transactions wer…
…e recovered in COMMITTED state lock_trx_release_locks(): Relax a debug assertion to allow recovered TRX_STATE_COMMITTED_IN_MEMORY transactions. trx_commit_in_memory(): Add DEBUG_SYNC instrumentation. trx_undo_insert_cleanup(): Skip persistent changes if innodb_read_only is set. This should only happen when a recovered committed transaction would be cleaned up at shutdown.
- Loading branch information
Showing
8 changed files
with
133 additions
and
8 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,43 @@ | ||
| CREATE TABLE t(a INT PRIMARY KEY) ENGINE=InnoDB; | ||
| INSERT INTO t VALUES(1); | ||
| BEGIN; | ||
| INSERT INTO t VALUES(2); | ||
| DELETE FROM t WHERE a=2; | ||
| # Normal MariaDB shutdown would roll back the above transaction. | ||
| # We want the transaction to remain open, so we will kill the server | ||
| # after ensuring that any non-transactional files are clean. | ||
| FLUSH TABLES; | ||
| # Create another transaction that will be recovered as COMMITTED. | ||
| BEGIN; | ||
| SET DEBUG_SYNC='after_trx_committed_in_memory SIGNAL committed WAIT_FOR ever'; | ||
| COMMIT; | ||
| SET DEBUG_SYNC='now WAIT_FOR committed'; | ||
| # Ensure that the above incomplete transactions become durable. | ||
| SET GLOBAL innodb_flush_log_at_trx_commit=1; | ||
| BEGIN; | ||
| INSERT INTO t VALUES(-10000); | ||
| ROLLBACK; | ||
| SELECT * FROM t; | ||
| a | ||
| 1 | ||
| SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; | ||
| SELECT * FROM t; | ||
| a | ||
| 1 | ||
| UPDATE t SET a=3 WHERE a=1; | ||
| ERROR HY000: Table 't' is read only | ||
| # Starting with MariaDB 10.2, innodb_read_only implies READ UNCOMMITTED. | ||
| # In earlier versions, this would return the last committed version | ||
| # (empty table)! | ||
| SELECT * FROM t; | ||
| a | ||
| 1 | ||
| SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; | ||
| SELECT * FROM t; | ||
| a | ||
| 1 | ||
| SELECT * FROM t; | ||
| a | ||
| 1 | ||
| DROP TABLE t; | ||
| NOT FOUND /Rolled back recovered transaction [^0]/ in mysqld.1.err |
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,68 @@ | ||
| --source include/have_innodb.inc | ||
| --source include/have_debug.inc | ||
| --source include/have_debug_sync.inc | ||
| # need to restart server | ||
| --source include/not_embedded.inc | ||
|
|
||
| --connect(con1, localhost, root) | ||
| CREATE TABLE t(a INT PRIMARY KEY) ENGINE=InnoDB; | ||
| INSERT INTO t VALUES(1); | ||
| BEGIN; | ||
| # Generate insert_undo log. | ||
| INSERT INTO t VALUES(2); | ||
| # Generate update_undo log. | ||
| DELETE FROM t WHERE a=2; | ||
| --connect(con2, localhost, root) | ||
| --echo # Normal MariaDB shutdown would roll back the above transaction. | ||
| --echo # We want the transaction to remain open, so we will kill the server | ||
| --echo # after ensuring that any non-transactional files are clean. | ||
| FLUSH TABLES; | ||
| --echo # Create another transaction that will be recovered as COMMITTED. | ||
| BEGIN; | ||
| # Generate multiple pages of both insert_undo and update_undo, so that | ||
| # the state TRX_UNDO_CACHE will not be chosen. | ||
| --disable_query_log | ||
| let $n= 10000; | ||
| while ($n) { | ||
| dec $n; | ||
| eval INSERT INTO t VALUES(-$n); | ||
| eval DELETE FROM t WHERE a=-$n; | ||
| } | ||
| --enable_query_log | ||
| SET DEBUG_SYNC='after_trx_committed_in_memory SIGNAL committed WAIT_FOR ever'; | ||
| send COMMIT; | ||
|
|
||
| connection default; | ||
| SET DEBUG_SYNC='now WAIT_FOR committed'; | ||
| --echo # Ensure that the above incomplete transactions become durable. | ||
| SET GLOBAL innodb_flush_log_at_trx_commit=1; | ||
| BEGIN; | ||
| INSERT INTO t VALUES(-10000); | ||
| ROLLBACK; | ||
| --let $restart_parameters= --innodb-force-recovery=3 | ||
| --let $shutdown_timeout= 0 | ||
| --source include/restart_mysqld.inc | ||
| --let $shutdown_timeout= 30 | ||
| --disconnect con1 | ||
| --disconnect con2 | ||
| SELECT * FROM t; | ||
| SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; | ||
| SELECT * FROM t; | ||
| # refused on MySQL 5.6, MariaDB 10.0, 10.1, but not MariaDB 10.2+ | ||
| --error ER_OPEN_AS_READONLY | ||
| UPDATE t SET a=3 WHERE a=1; | ||
| --let $restart_parameters= --innodb-read-only | ||
| --source include/restart_mysqld.inc | ||
| --echo # Starting with MariaDB 10.2, innodb_read_only implies READ UNCOMMITTED. | ||
| --echo # In earlier versions, this would return the last committed version | ||
| --echo # (empty table)! | ||
| SELECT * FROM t; | ||
| SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; | ||
| SELECT * FROM t; | ||
| --let $restart_parameters= | ||
| --source include/restart_mysqld.inc | ||
| SELECT * FROM t; | ||
| DROP TABLE t; | ||
| let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err; | ||
| --let SEARCH_PATTERN= Rolled back recovered transaction [^0] | ||
| --source include/search_pattern_in_file.inc |
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
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
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
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
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
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