diff --git a/src/box/index.cc b/src/box/index.cc index d30bb362532c6b8f93ff51ca046121426bec341c..2b67932de757086320fb78e421b41d3951ebd5e1 100644 --- a/src/box/index.cc +++ b/src/box/index.cc @@ -790,13 +790,13 @@ void index_delete(struct index *index) { assert(index->refs == 0); + assert(rlist_empty(&index->read_gaps)); /* * Free index_def after destroying the index as * engine might still need it, e.g. to check if * the index is primary or secondary. */ struct index_def *def = index->def; - memtx_tx_on_index_delete(index); index->vtab->destroy(index); index_def_delete(def); } diff --git a/src/box/memtx_tx.c b/src/box/memtx_tx.c index 8c29c9432c049458afbebbf646221a84d64dd515..5f8ba53077d66f4f9cb0e44d8fa60cd9887fac0e 100644 --- a/src/box/memtx_tx.c +++ b/src/box/memtx_tx.c @@ -2760,19 +2760,6 @@ memtx_tx_delete_gap(struct gap_item_base *item) memtx_tx_mempool_free(item->txn, pool, item); } -void -memtx_tx_on_index_delete(struct index *index) -{ - while (!rlist_empty(&index->read_gaps)) { - struct gap_item_base *item = - rlist_first_entry(&index->read_gaps, - struct gap_item_base, - in_read_gaps); - memtx_tx_delete_gap(item); - } - memtx_tx_story_gc(); -} - void memtx_tx_invalidate_space(struct space *space, struct txn *active_txn) { @@ -2883,6 +2870,21 @@ memtx_tx_invalidate_space(struct space *space, struct txn *active_txn) stmt->engine_savepoint = NULL; } } + + /* + * Phase four: remove all read trackers from the space indexes. Since + * all concurrent transactions are aborted, we don't need them anymore. + */ + for (size_t i = 0; i < space->index_count; i++) { + struct index *index = space->index[i]; + while (!rlist_empty(&index->read_gaps)) { + struct gap_item_base *item = + rlist_first_entry(&index->read_gaps, + struct gap_item_base, + in_read_gaps); + memtx_tx_delete_gap(item); + } + } } /** diff --git a/src/box/memtx_tx.h b/src/box/memtx_tx.h index 992a12609197a38a25b9bc9e1f42c08570ee61d1..e298c248afbeab6eda4101a197abf4846e739b76 100644 --- a/src/box/memtx_tx.h +++ b/src/box/memtx_tx.h @@ -404,14 +404,6 @@ memtx_tx_index_invisible_count(struct txn *txn, void memtx_tx_clean_txn(struct txn *txn); -/** - * Notify manager tha an index is deleted and free data, save in index. - * - * NB: can trigger story garbage collection. - */ -void -memtx_tx_on_index_delete(struct index *index); - /** * Invalidate space in memtx tx: remove all the objects associated with * space and its schema. The helper is supposed to be called when there is