From d2663cc204d73b2ce698e90caf03307dbfbd143c Mon Sep 17 00:00:00 2001 From: Andrey Saranchin <Andrey22102001@gmail.com> Date: Mon, 9 Sep 2024 19:00:14 +0300 Subject: [PATCH] memtx: invalidate index right on DDL in MVCC Currently, we delete MVCC trackers from index when it's being deleted. It doesn't actually break anything but we can do it right on DDL since all concurrent transactions are aborted and trackers are not needed anymore. Also, having a saved key belonging to old key def (it's saved by gap inplace item) is not a good idea and can lead to sudden bugs in future - let's just delete all the trackers right on DDL while we are here. Follow-up #10146 NO_TEST=refactoring NO_CHANGELOG=refactoring NO_DOC=refactoring (cherry picked from commit 8879489834f39fdb46093c1988fbf4f1601d51ff) --- src/box/index.cc | 2 +- src/box/memtx_tx.c | 28 +++++++++++++++------------- src/box/memtx_tx.h | 8 -------- 3 files changed, 16 insertions(+), 22 deletions(-) diff --git a/src/box/index.cc b/src/box/index.cc index d30bb36253..2b67932de7 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 8c29c9432c..5f8ba53077 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 992a126091..e298c248af 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 -- GitLab