mirror of
https://github.com/MariaDB/server.git
synced 2025-12-24 11:21:21 +03:00
MDEV-22867 Assertion instant.n_core_fields == n_core_fields failed
This is a race condition where a table on which a 10.3-style instant ADD COLUMN is emptied during the execution of ALTER TABLE ... DROP COLUMN ..., DROP INDEX ..., ALGORITHM=NOCOPY. In commit2c4844c9e7the function instant_metadata_lock() would prevent this race condition. But, it would also hold a page latch on the leftmost leaf page of clustered index for the duration of a possible DROP INDEX operation. The race could be fixed by restoring the function instant_metadata_lock() that was removed in commitea37b14409but it would be more future-proof to prevent the dict_index_t::clear_instant_add() call from being issued at all. We at some point support DROP COLUMN ..., ADD INDEX ..., ALGORITHM=NOCOPY and that would spend a non-trivial amount of execution time in ha_innobase::inplace_alter(), making a server hang possible. Currently this is not supported and our added test case will notice when the support is introduced. dict_index_t::must_avoid_clear_instant_add(): Determine if a call to clear_instant_add() must be avoided. btr_discard_only_page_on_level(): Preserve the metadata record if must_avoid_clear_instant_add() holds. btr_cur_optimistic_delete_func(), btr_cur_pessimistic_delete(): Do not remove the metadata record even if the table becomes empty but must_avoid_clear_instant_add() holds. btr_pcur_store_position(): Relax a debug assertion. This is joint work with Thirunarayanan Balathandayuthapani.
This commit is contained in:
@@ -370,3 +370,36 @@ b
|
||||
SET DEBUG_SYNC='RESET';
|
||||
disconnect con2;
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# MDEV-22867 Assertion instant.n_core_fields == n_core_fields
|
||||
# in dict_index_t::instant_add_field
|
||||
#
|
||||
CREATE TABLE t1 (a INT PRIMARY KEY, b INT UNIQUE) ENGINE=InnoDB;
|
||||
INSERT INTO t1 SET a=1;
|
||||
connect prevent_purge,localhost,root,,;
|
||||
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
||||
connection default;
|
||||
ALTER TABLE t1 ADD COLUMN c INT;
|
||||
DELETE FROM t1;
|
||||
connect con2,localhost,root,,test;
|
||||
ALTER TABLE t1 DROP b, ADD INDEX(c), ALGORITHM=NOCOPY;
|
||||
ERROR 0A000: ALGORITHM=NOCOPY is not supported for this operation. Try ALGORITHM=INPLACE
|
||||
SET DEBUG_SYNC='innodb_inplace_alter_table_enter SIGNAL ddl WAIT_FOR emptied';
|
||||
ALTER TABLE t1 DROP b;
|
||||
connection default;
|
||||
SET DEBUG_SYNC='now WAIT_FOR ddl';
|
||||
BEGIN;
|
||||
INSERT INTO t1 SET a=1;
|
||||
connection prevent_purge;
|
||||
COMMIT;
|
||||
disconnect prevent_purge;
|
||||
connection default;
|
||||
ROLLBACK;
|
||||
SELECT * FROM t1;
|
||||
a b c
|
||||
SET DEBUG_SYNC='now SIGNAL emptied';
|
||||
connection con2;
|
||||
disconnect con2;
|
||||
connection default;
|
||||
DROP TABLE t1;
|
||||
SET DEBUG_SYNC=RESET;
|
||||
|
||||
Reference in New Issue
Block a user