mirror of
https://github.com/MariaDB/server.git
synced 2025-01-31 02:51:44 +01:00
4f8555f1f6
MDEV-14511 tried to avoid some consistency problems related to InnoDB persistent statistics. The persistent statistics are being written by an InnoDB internal SQL interpreter that requires the InnoDB data dictionary cache to be locked. Before MDEV-14511, the statistics were written during DDL in separate transactions, which could unnecessarily reduce performance (each commit would require a redo log flush) and break atomicity, because the statistics would be updated separately from the dictionary transaction. However, because it is unacceptable to hold the InnoDB data dictionary cache locked while suspending the execution for waiting for a transactional lock (in the mysql.innodb_index_stats or mysql.innodb_table_stats tables) to be released, any lock conflict was immediately be reported as "lock wait timeout". To fix MDEV-14941, an attempt to reduce these lock conflicts by acquiring transactional locks on the user tables in both the statistics and DDL operations was made, but it would still not entirely prevent lock conflicts on the mysql.innodb_index_stats and mysql.innodb_table_stats tables. Fixing the remaining problems would require a change that is too intrusive for a GA release series, such as MariaDB 10.2. Thefefore, we revert the change MDEV-14511. To silence the MDEV-13201 assertion, we use the pre-existing flag trx_t::internal.
61 lines
1.4 KiB
Text
61 lines
1.4 KiB
Text
#
|
|
# Test the persistent stats feature when DROPping a table or an
|
|
# index when the corresponding rows in the stats tables are locked
|
|
#
|
|
|
|
-- source include/have_innodb.inc
|
|
|
|
-- disable_warnings
|
|
-- disable_query_log
|
|
|
|
DROP TABLE IF EXISTS innodb_stats_drop_locked;
|
|
|
|
CREATE TABLE innodb_stats_drop_locked (c INT, KEY c_key (c))
|
|
ENGINE=INNODB STATS_PERSISTENT=1;
|
|
|
|
ANALYZE TABLE innodb_stats_drop_locked;
|
|
|
|
-- enable_warnings
|
|
-- enable_query_log
|
|
|
|
SET autocommit=0;
|
|
|
|
SELECT table_name FROM mysql.innodb_table_stats
|
|
WHERE table_name='innodb_stats_drop_locked'
|
|
FOR UPDATE;
|
|
|
|
SELECT table_name FROM mysql.innodb_index_stats
|
|
WHERE table_name='innodb_stats_drop_locked'
|
|
FOR UPDATE;
|
|
|
|
-- connect (con1,localhost,root,,)
|
|
|
|
-- connection con1
|
|
|
|
ALTER TABLE innodb_stats_drop_locked DROP INDEX c_key;
|
|
|
|
# the index should be gone
|
|
SHOW CREATE TABLE innodb_stats_drop_locked;
|
|
|
|
DROP TABLE innodb_stats_drop_locked;
|
|
|
|
# the table should be gone
|
|
SHOW TABLES;
|
|
|
|
-- connection default
|
|
|
|
-- disconnect con1
|
|
|
|
COMMIT;
|
|
|
|
# the stats should be there
|
|
|
|
SELECT table_name FROM mysql.innodb_table_stats
|
|
WHERE table_name='innodb_stats_drop_locked';
|
|
|
|
SELECT table_name FROM mysql.innodb_index_stats
|
|
WHERE table_name='innodb_stats_drop_locked';
|
|
|
|
--disable_query_log
|
|
call mtr.add_suppression("Unable to delete statistics for table test.innodb_stats_drop_locked: Lock wait timeout. They can be deleted later using DELETE FROM mysql.innodb_index_stats WHERE database_name");
|
|
--enable_query_log
|