mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +01:00
Fix bug #57700 Latching order violation in row_truncate_table_for_mysql().
Approved by Sunny Bains
This commit is contained in:
parent
1e09ea9549
commit
ed2e88e66c
2 changed files with 20 additions and 9 deletions
|
@ -1,3 +1,9 @@
|
|||
2010-10-24 The InnoDB Team
|
||||
|
||||
* row/row0mysql.c
|
||||
Fix Bug #57700 Latching order violation in
|
||||
row_truncate_table_for_mysql()
|
||||
|
||||
2010-10-20 The InnoDB Team
|
||||
|
||||
* dict/dict0load.c
|
||||
|
|
|
@ -2782,15 +2782,6 @@ row_truncate_table_for_mysql(
|
|||
|
||||
trx->table_id = table->id;
|
||||
|
||||
/* Lock all index trees for this table, as we will
|
||||
truncate the table/index and possibly change their metadata.
|
||||
All DML/DDL are blocked by table level lock, with
|
||||
a few exceptions such as queries into information schema
|
||||
about the table, MySQL could try to access index stats
|
||||
for this kind of query, we need to use index locks to
|
||||
sync up */
|
||||
dict_table_x_lock_indexes(table);
|
||||
|
||||
if (table->space && !table->dir_path_of_temp_table) {
|
||||
/* Discard and create the single-table tablespace. */
|
||||
ulint space = table->space;
|
||||
|
@ -2803,6 +2794,11 @@ row_truncate_table_for_mysql(
|
|||
|
||||
dict_hdr_get_new_id(NULL, NULL, &space);
|
||||
|
||||
/* Lock all index trees for this table. We must
|
||||
do so after dict_hdr_get_new_id() to preserve
|
||||
the latch order */
|
||||
dict_table_x_lock_indexes(table);
|
||||
|
||||
if (space == ULINT_UNDEFINED
|
||||
|| fil_create_new_single_table_tablespace(
|
||||
space, table->name, FALSE, flags,
|
||||
|
@ -2836,6 +2832,15 @@ row_truncate_table_for_mysql(
|
|||
FIL_IBD_FILE_INITIAL_SIZE, &mtr);
|
||||
mtr_commit(&mtr);
|
||||
}
|
||||
} else {
|
||||
/* Lock all index trees for this table, as we will
|
||||
truncate the table/index and possibly change their metadata.
|
||||
All DML/DDL are blocked by table level lock, with
|
||||
a few exceptions such as queries into information schema
|
||||
about the table, MySQL could try to access index stats
|
||||
for this kind of query, we need to use index locks to
|
||||
sync up */
|
||||
dict_table_x_lock_indexes(table);
|
||||
}
|
||||
|
||||
/* scan SYS_INDEXES for all indexes of the table */
|
||||
|
|
Loading…
Reference in a new issue