mirror of
https://github.com/MariaDB/server.git
synced 2025-01-25 00:04:33 +01:00
Do not break the latching order in TRUNCATE TABLE.
dict_truncate_index_tree(): Replace parameter rec_t* rec with btr_pcur_t* pcur. Reposition pcur before calling btr_create(). sync_thread_add_level(): Remove the relaxation of the assertion added in r968.
This commit is contained in:
parent
c7e13ec677
commit
d260926abf
4 changed files with 16 additions and 12 deletions
|
@ -700,8 +700,10 @@ dict_truncate_index_tree(
|
|||
/* out: new root page number, or
|
||||
FIL_NULL on failure */
|
||||
dict_table_t* table, /* in: the table the index belongs to */
|
||||
rec_t* rec, /* in: record in the clustered index of
|
||||
SYS_INDEXES table */
|
||||
btr_pcur_t* pcur, /* in/out: persistent cursor pointing to
|
||||
record in the clustered index of
|
||||
SYS_INDEXES table. The cursor may be
|
||||
repositioned in this call. */
|
||||
mtr_t* mtr) /* in: mtr having the latch
|
||||
on the record page. The mtr may be
|
||||
committed and restarted in this call. */
|
||||
|
@ -710,6 +712,7 @@ dict_truncate_index_tree(
|
|||
ulint space;
|
||||
ulint type;
|
||||
dulint index_id;
|
||||
rec_t* rec;
|
||||
byte* ptr;
|
||||
ulint len;
|
||||
ulint comp;
|
||||
|
@ -720,6 +723,7 @@ dict_truncate_index_tree(
|
|||
#endif /* UNIV_SYNC_DEBUG */
|
||||
|
||||
ut_a(!dict_table_is_comp(dict_sys->sys_indexes));
|
||||
rec = btr_pcur_get_rec(pcur);
|
||||
ptr = rec_get_nth_field_old(rec, DICT_SYS_INDEXES_PAGE_NO_FIELD, &len);
|
||||
|
||||
ut_ad(len == 4);
|
||||
|
@ -785,10 +789,11 @@ dict_truncate_index_tree(
|
|||
/* We will need to commit the mini-transaction in order to avoid
|
||||
deadlocks in the btr_create() call, because otherwise we would
|
||||
be freeing and allocating pages in the same mini-transaction. */
|
||||
btr_pcur_store_position(pcur, mtr);
|
||||
mtr_commit(mtr);
|
||||
/* mtr_commit() will invalidate rec. */
|
||||
rec = NULL;
|
||||
|
||||
mtr_start(mtr);
|
||||
btr_pcur_restore_position(BTR_MODIFY_LEAF, pcur, mtr);
|
||||
|
||||
/* Find the index corresponding to this SYS_INDEXES record. */
|
||||
for (index = UT_LIST_GET_FIRST(table->indexes);
|
||||
|
|
|
@ -62,8 +62,10 @@ dict_truncate_index_tree(
|
|||
/* out: new root page number, or
|
||||
FIL_NULL on failure */
|
||||
dict_table_t* table, /* in: the table the index belongs to */
|
||||
rec_t* rec, /* in: record in the clustered index of
|
||||
SYS_INDEXES table */
|
||||
btr_pcur_t* pcur, /* in/out: persistent cursor pointing to
|
||||
record in the clustered index of
|
||||
SYS_INDEXES table. The cursor may be
|
||||
repositioned in this call. */
|
||||
mtr_t* mtr); /* in: mtr having the latch
|
||||
on the record page. The mtr may be
|
||||
committed and restarted in this call. */
|
||||
|
|
|
@ -2820,12 +2820,10 @@ row_truncate_table_for_mysql(
|
|||
goto next_rec;
|
||||
}
|
||||
|
||||
btr_pcur_store_position(&pcur, &mtr);
|
||||
/* This call may commit and restart mtr
|
||||
and reposition pcur. */
|
||||
root_page_no = dict_truncate_index_tree(table, &pcur, &mtr);
|
||||
|
||||
/* This call may commit and restart mtr. */
|
||||
root_page_no = dict_truncate_index_tree(table, rec, &mtr);
|
||||
|
||||
btr_pcur_restore_position(BTR_MODIFY_LEAF, &pcur, &mtr);
|
||||
rec = btr_pcur_get_rec(&pcur);
|
||||
|
||||
if (root_page_no != FIL_NULL) {
|
||||
|
|
|
@ -1134,7 +1134,6 @@ sync_thread_add_level(
|
|||
break;
|
||||
case SYNC_TREE_NODE:
|
||||
ut_a(sync_thread_levels_contain(array, SYNC_INDEX_TREE)
|
||||
|| sync_thread_levels_contain(array, SYNC_DICT_OPERATION)
|
||||
|| sync_thread_levels_g(array, SYNC_TREE_NODE - 1));
|
||||
break;
|
||||
case SYNC_TREE_NODE_NEW:
|
||||
|
|
Loading…
Add table
Reference in a new issue