mirror of
https://github.com/MariaDB/server.git
synced 2025-11-30 05:23:50 +03:00
In commit 91599701d0 (MDEV-25312)
some recovery code for TRUNCATE TABLE was broken
causing a regression in a case where undo log for a RENAME TABLE
operation had been durably written but the tablespace had not been
renamed yet.
row_rename_table_for_mysql(): Add a DEBUG_SYNC point for the
test case, and simplify the logic and trim the error messages.
fil_space_t::rename(): Simplify the operation. Merge the necessary
part of fil_rename_tablespace_check(). If there is no change to
the file name, do nothing.
dict_table_t::rename_tablespace(): Refactored from
dict_table_rename_in_cache().
row_undo_ins_parse_undo_rec(): On rolling back TRX_UNDO_RENAME_TABLE,
invoke dict_table_t::rename_tablespace() even if the table name matches.
os_file_rename_func(): Temporarily relax an assertion that would
fail during the recovery in the test innodb.truncate_crash.
42 lines
1011 B
Plaintext
42 lines
1011 B
Plaintext
--source include/have_innodb.inc
|
|
--source include/have_debug.inc
|
|
--source include/have_debug_sync.inc
|
|
--source include/not_embedded.inc
|
|
|
|
FLUSH TABLES;
|
|
LET $datadir= `SELECT @@datadir`;
|
|
|
|
CREATE TABLE t1 (a SERIAL, b INT, c INT, d INT) ENGINE=InnoDB;
|
|
INSERT INTO t1 () VALUES ();
|
|
|
|
--connect (con1,localhost,root,,test)
|
|
SET DEBUG_SYNC='before_rename_table_commit SIGNAL renamed WAIT_FOR ever';
|
|
--send
|
|
RENAME TABLE t1 TO t2;
|
|
--connection default
|
|
SET DEBUG_SYNC='now WAIT_FOR renamed';
|
|
--let $shutdown_timeout=0
|
|
--source include/restart_mysqld.inc
|
|
--disconnect con1
|
|
SELECT * FROM t1;
|
|
|
|
CREATE TABLE t2 (a INT PRIMARY KEY) ENGINE=InnoDB;
|
|
BEGIN;
|
|
INSERT INTO t2 VALUES(1);
|
|
|
|
--connect (con1,localhost,root,,test)
|
|
SET DEBUG_SYNC='innodb_rename_in_cache SIGNAL committed WAIT_FOR ever';
|
|
--send
|
|
RENAME TABLE t1 TO t3;
|
|
--connection default
|
|
SET DEBUG_SYNC='now WAIT_FOR committed';
|
|
COMMIT;
|
|
|
|
--let $shutdown_timeout=0
|
|
--source include/restart_mysqld.inc
|
|
--disconnect con1
|
|
SELECT * FROM t1;
|
|
SELECT * FROM t2;
|
|
|
|
DROP TABLE t1,t2;
|