mariadb/storage
Marko Mäkelä d1a6792324 MDEV-36122: Protect table references with a lock
dict_table_open_on_id(): Simplify the logic.

dict_stats: A helper for acquiring MDL and opening the tables
mysql.innodb_table_stats and mysql.innodb_index_stats.

innodb_ft_aux_table_validate(): Contiguously hold dict_sys.latch
while accessing the table that we open with dict_table_open_on_name().

lock_table_children(): Do not hold a table reference while invoking
dict_acquire_mdl_shared<false>(), which may temporarily release and
reacquire the shared dict_sys.latch that we are holding.

prepare_inplace_alter_table_dict(): If an unexpected reference to the
table exists, wait for the purge subsystem to release its table handle,
similar to how we would do in case FULLTEXT INDEX existed. This function
is supposed to be protected by MDL_EXCLUSIVE on the table name.
If purge is going to access the table again later during is ALTER TABLE
operation, it will have access to an MDL compatible name for it and
therefore should conflict with any MDL_EXCLUSIVE that would cover
ha_innobase::commit_inplace_alter_table(commit=true).

ha_innobase::rename_table(): Before locking the data dictionary,
ensure that the purge subsystem is not holding a reference to the
table due to the lack of metadata locking, related to FULLTEXT INDEX
or the row-level undo logging of ALTER IGNORE TABLE.

ha_innobase::truncate(): Before locking the data dictionary,
ensure that the purge subsystem is not holding a reference to the
table due to insufficient metadata locking related to an earlier
ALTER IGNORE TABLE operation.

trx_purge_attach_undo_recs(), purge_sys_t::batch_cleanup():
Clear purge_sys.m_active only after all table handles have been released.

With these changes, no caller of dict_acquire_mdl_shared<false>
should be holding a table reference.

All remaining calls to dict_table_open_on_name(dict_locked=false)
except the one in fts_lock_table() and possibly in the DDL recovery
predicate innodb_check_version() should be protected by MDL, but there
currently is no assertion that would enforce this.

Reviewed by: Debarun Banerjee
2025-03-26 14:31:44 +02:00
..
archive Merge 10.6 into 10.11 2024-06-27 10:26:09 +03:00
blackhole MDEV-34348: my_hash_get_key fixes 2024-11-23 08:14:22 -07:00
columnstore Merge branch '10.6' into 10.11 2025-01-30 11:55:13 +01:00
connect Merge branch '10.6' into 10.11 2025-01-30 11:55:13 +01:00
csv Merge 10.6 into 10.11 2024-11-29 13:43:17 +02:00
example Remove dates from all rdiff files 2025-01-05 16:40:11 +02:00
federated Merge 10.5 into 10.6 2024-11-29 12:37:46 +02:00
federatedx Allow 'mariadb' as a connection wrapper name for FederatedX. 2025-02-25 16:04:56 +02:00
heap Merge 10.5 into 10.6 2025-01-20 09:57:37 +02:00
innobase MDEV-36122: Protect table references with a lock 2025-03-26 14:31:44 +02:00
maria MDEV-36056 Fix VS2019 compilation 2025-02-10 15:27:08 +01:00
mroonga Merge 10.6 into 10.11 2024-12-19 15:38:53 +02:00
myisam Merge branch '10.6' into 10.11 2025-01-30 11:55:13 +01:00
myisammrg Merge 10.6 into 10.11 2025-01-08 12:51:26 +02:00
oqgraph Merge 10.6 into 10.11 2024-11-29 13:43:17 +02:00
perfschema Merge branch '10.6' into 10.11 2025-01-10 13:14:42 +01:00
rocksdb Merge branch '10.6' into 10.11 2025-01-10 13:14:42 +01:00
sequence MDEV-33746 Supply missing override markings 2024-06-20 11:32:13 -04:00
sphinx Merge 10.5 into 10.6 2024-11-29 12:37:46 +02:00
spider MDEV-29605 Reset queued ping info of all spider connections associated with a closed spider handler 2025-02-24 14:47:58 +11:00
test_sql_discovery Merge 10.5 into 10.6 2024-06-24 13:09:47 +03:00