1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

MDEV-29144 ER_TABLE_SCHEMA_MISMATCH or crash on DISCARD/IMPORT

mysql_discard_or_import_tablespace(): On successful
ALTER TABLE...DISCARD TABLESPACE, evict the table handle from the
table definition cache, so that ha_innobase::close() will be invoked,
like InnoDB expects to be the case. This will avoid an assertion failure
ut_a(table->get_ref_count() == 0) during IMPORT TABLESPACE.

ha_innobase::open(): Do not issue any ER_TABLESPACE_DISCARDED warning.
Member functions for DML will do that.

ha_innobase::truncate(), ha_innobase::check_if_supported_inplace_alter():
Issue ER_TABLESPACE_DISCARDED warnings, to compensate for the removal of
the warning in ha_innobase::open().

row_quiesce_write_indexes(): Only write information about committed
indexes. The ALTER TABLE t NOWAIT ADD INDEX(c) in the nondeterministic
test case will most of the time fail due to a metadata lock (MDL) timeout
and leave behind an uncommitted index.

Reviewed by: Sergei Golubchik
This commit is contained in:
Marko Mäkelä
2022-12-09 10:42:19 +02:00
parent 8f3631d009
commit 782b2a7500
7 changed files with 110 additions and 7 deletions

View File

@ -0,0 +1,26 @@
#
# MDEV-29144 ER_TABLE_SCHEMA_MISMATCH or crash on DISCARD/IMPORT
#
CREATE TABLE t (pk int PRIMARY KEY, c varchar(1024))
ENGINE=InnoDB CHARSET latin1;
INSERT INTO t SELECT seq, 'x' FROM seq_1_to_100;
connect con1,localhost,root,,test;
BEGIN NOT ATOMIC
DECLARE a INT DEFAULT 0;
REPEAT
SET a= a+1;
UPDATE t SET c = 'xx' WHERE pk = a;
UNTIL a = 100
END REPEAT;
END
$
connection default;
ALTER TABLE t NOWAIT ADD INDEX (c);
connection con1;
connection default;
FLUSH TABLE t FOR EXPORT;
UNLOCK TABLES;
DROP TABLE t;
ALTER TABLE t DISCARD TABLESPACE;
ALTER TABLE t IMPORT TABLESPACE;
DROP TABLE t;

View File

@ -0,0 +1,54 @@
--source include/have_innodb.inc
--source include/have_sequence.inc
--echo #
--echo # MDEV-29144 ER_TABLE_SCHEMA_MISMATCH or crash on DISCARD/IMPORT
--echo #
CREATE TABLE t (pk int PRIMARY KEY, c varchar(1024))
ENGINE=InnoDB CHARSET latin1;
INSERT INTO t SELECT seq, 'x' FROM seq_1_to_100;
--connect (con1,localhost,root,,test)
--delimiter $
--send
BEGIN NOT ATOMIC
DECLARE a INT DEFAULT 0;
REPEAT
SET a= a+1;
UPDATE t SET c = 'xx' WHERE pk = a;
UNTIL a = 100
END REPEAT;
END
$
--delimiter ;
--connection default
--error 0,ER_LOCK_WAIT_TIMEOUT
ALTER TABLE t NOWAIT ADD INDEX (c);
--connection con1
--reap
--connection default
--let $datadir= `select @@datadir`
FLUSH TABLE t FOR EXPORT;
--let $create= query_get_value(SHOW CREATE TABLE t, Create Table, 1)
--copy_file $datadir/test/t.cfg $MYSQL_TMP_DIR/t.cfg
--copy_file $datadir/test/t.ibd $MYSQL_TMP_DIR/t.ibd
UNLOCK TABLES;
DROP TABLE t;
--disable_query_log
eval $create;
--enable_query_log
ALTER TABLE t DISCARD TABLESPACE;
--move_file $MYSQL_TMP_DIR/t.cfg $datadir/test/t.cfg
--move_file $MYSQL_TMP_DIR/t.ibd $datadir/test/t.ibd
ALTER TABLE t IMPORT TABLESPACE;
# Cleanup
DROP TABLE t;