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