mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Fix bug #57700 Latching order violation in row_truncate_table_for_mysql().
Approved by Sunny Bains
This commit is contained in:
@ -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
|
2010-10-20 The InnoDB Team
|
||||||
|
|
||||||
* dict/dict0load.c
|
* dict/dict0load.c
|
||||||
|
@ -2782,15 +2782,6 @@ row_truncate_table_for_mysql(
|
|||||||
|
|
||||||
trx->table_id = table->id;
|
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) {
|
if (table->space && !table->dir_path_of_temp_table) {
|
||||||
/* Discard and create the single-table tablespace. */
|
/* Discard and create the single-table tablespace. */
|
||||||
ulint space = table->space;
|
ulint space = table->space;
|
||||||
@ -2803,6 +2794,11 @@ row_truncate_table_for_mysql(
|
|||||||
|
|
||||||
dict_hdr_get_new_id(NULL, NULL, &space);
|
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
|
if (space == ULINT_UNDEFINED
|
||||||
|| fil_create_new_single_table_tablespace(
|
|| fil_create_new_single_table_tablespace(
|
||||||
space, table->name, FALSE, flags,
|
space, table->name, FALSE, flags,
|
||||||
@ -2836,6 +2832,15 @@ row_truncate_table_for_mysql(
|
|||||||
FIL_IBD_FILE_INITIAL_SIZE, &mtr);
|
FIL_IBD_FILE_INITIAL_SIZE, &mtr);
|
||||||
mtr_commit(&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 */
|
/* scan SYS_INDEXES for all indexes of the table */
|
||||||
|
Reference in New Issue
Block a user