From 1aa186fa72221e29738234464ab1a6a41d9847c9 Mon Sep 17 00:00:00 2001 From: Vladimir Davydov <vdavydov@tarantool.org> Date: Thu, 18 Aug 2022 15:50:35 +0300 Subject: [PATCH] memtx: reset read view key_def Tuples stored in a read view might not have a format, because we overwrite the tuple format id when we free a tuple. So for anything more sophisticated than a full-scan, we need to use special comparators that don't access the tuple format. To address that, let's provide a way to reset tree and hash key_def if ENABLE_READ_VIEW is defined. The stub functions simply reset the read view key_def to NULL, because it isn't supposed to be used in the CE version. Needed for https://github.com/tarantool/tarantool-ee/issues/197 NO_DOC=internal NO_TEST=ee NO_CHANGELOG=internal --- src/box/memtx_hash.cc | 7 +++++++ src/box/memtx_tree.cc | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/src/box/memtx_hash.cc b/src/box/memtx_hash.cc index 72e2b40afd..a868a53a14 100644 --- a/src/box/memtx_hash.cc +++ b/src/box/memtx_hash.cc @@ -546,6 +546,12 @@ hash_read_view_iterator_start(struct hash_read_view_iterator *it, return 0; } +static void +hash_read_view_reset_key_def(struct hash_read_view *rv) +{ + rv->view.common.arg = NULL; +} + #endif /* !defined(ENABLE_READ_VIEW) */ /** Implementation of create_iterator index_read_view callback. */ @@ -588,6 +594,7 @@ memtx_hash_index_create_read_view(struct index *base) rv->index = index; index_ref(base); light_index_view_create(&rv->view, &index->hash_table); + hash_read_view_reset_key_def(rv); return (struct index_read_view *)rv; } diff --git a/src/box/memtx_tree.cc b/src/box/memtx_tree.cc index fc32c8e6d3..a58b9d864a 100644 --- a/src/box/memtx_tree.cc +++ b/src/box/memtx_tree.cc @@ -1762,6 +1762,13 @@ tree_read_view_iterator_start(struct tree_read_view_iterator<USE_HINT> *it, return 0; } +template <bool USE_HINT> +static void +tree_read_view_reset_key_def(struct tree_read_view<USE_HINT> *rv) +{ + rv->tree_view.common.arg = NULL; +} + #endif /* !defined(ENABLE_READ_VIEW) */ /** Implementation of create_iterator index_read_view callback. */ @@ -1813,6 +1820,7 @@ memtx_tree_index_create_read_view(struct index *base) rv->index = index; index_ref(base); memtx_tree_view_create(&rv->tree_view, &index->tree); + tree_read_view_reset_key_def(rv); return (struct index_read_view *)rv; } -- GitLab