diff --git a/src/box/index.cc b/src/box/index.cc index 3058e668a50ee41b75a94ce792a1d3e73710e187..74eeeaa3ad8719db35d5f6345544125998e3f541 100644 --- a/src/box/index.cc +++ b/src/box/index.cc @@ -603,6 +603,26 @@ index_delete(struct index *index) index_def_delete(def); } +int +index_read_view_create(struct index_read_view *rv, + const struct index_read_view_vtab *vtab, + struct index_def *def) +{ + rv->vtab = vtab; + rv->def = index_def_dup(def); + if (rv->def == NULL) + return -1; + return 0; +} + +void +index_read_view_delete(struct index_read_view *rv) +{ + struct index_def *def = rv->def; + rv->vtab->free(rv); + index_def_delete(def); +} + /* }}} */ /* {{{ Virtual method stubs */ diff --git a/src/box/index.h b/src/box/index.h index 8a392b67a0c01cccceaf5dbfef872764ee6a907b..b3f5e79a5c7bcb45e4bc3f74cb588202ff659a39 100644 --- a/src/box/index.h +++ b/src/box/index.h @@ -571,6 +571,8 @@ struct index_read_view_vtab { struct index_read_view { /** Virtual function table. */ const struct index_read_view_vtab *vtab; + /** Copy of the index definition. */ + struct index_def *def; }; /** Iterator over an index read view. */ @@ -821,11 +823,18 @@ index_end_build(struct index *index) index->vtab->end_build(index); } -static inline void -index_read_view_delete(struct index_read_view *rv) -{ - rv->vtab->free(rv); -} +/** + * Initialize an index read view instance. + * Note, this function copies the given index definition. + */ +int +index_read_view_create(struct index_read_view *rv, + const struct index_read_view_vtab *vtab, + struct index_def *def); + +/** Free an index read view instance. */ +void +index_read_view_delete(struct index_read_view *rv); static inline struct index_read_view_iterator * index_read_view_create_iterator(struct index_read_view *rv, diff --git a/src/box/memtx_hash.cc b/src/box/memtx_hash.cc index 25f6fd32cd567244aa84c2f28c68c1a246a7d516..3c3b6660754433384cfe34388a25d78f130d43da 100644 --- a/src/box/memtx_hash.cc +++ b/src/box/memtx_hash.cc @@ -562,9 +562,12 @@ memtx_hash_index_create_read_view(struct index *base) struct memtx_hash_index *index = (struct memtx_hash_index *)base; struct hash_read_view *rv = (struct hash_read_view *)xmalloc(sizeof(*rv)); + if (index_read_view_create(&rv->base, &vtab, base->def) != 0) { + free(rv); + return NULL; + } struct space *space = space_cache_find(base->def->space_id); memtx_tx_snapshot_cleaner_create(&rv->cleaner, space); - rv->base.vtab = &vtab; rv->index = index; index_ref(base); light_index_view_create(&rv->view, &index->hash_table); diff --git a/src/box/memtx_tree.cc b/src/box/memtx_tree.cc index 02c5e24c503a541b23c241f56512d92ed704a78b..9c5dddb059e4242a8156ed8193c24119e7f31ddd 100644 --- a/src/box/memtx_tree.cc +++ b/src/box/memtx_tree.cc @@ -1782,9 +1782,12 @@ memtx_tree_index_create_read_view(struct index *base) (struct memtx_tree_index<USE_HINT> *)base; struct tree_read_view<USE_HINT> *rv = (struct tree_read_view<USE_HINT> *)xmalloc(sizeof(*rv)); + if (index_read_view_create(&rv->base, &vtab, base->def) != 0) { + free(rv); + return NULL; + } struct space *space = space_cache_find(base->def->space_id); memtx_tx_snapshot_cleaner_create(&rv->cleaner, space); - rv->base.vtab = &vtab; rv->index = index; index_ref(base); memtx_tree_view_create(&rv->tree_view, &index->tree); diff --git a/src/box/sequence.c b/src/box/sequence.c index f6eefd4bc1bafc571fc2bad412e0fd4e49d7b5f7..9db36fe7c313facb389428c83f4f61e8841e1da5 100644 --- a/src/box/sequence.c +++ b/src/box/sequence.c @@ -396,7 +396,10 @@ sequence_data_read_view_create(struct index *index) .create_iterator = sequence_data_iterator_create, }; struct sequence_data_read_view *rv = xmalloc(sizeof(*rv)); - rv->base.vtab = &vtab; + if (index_read_view_create(&rv->base, &vtab, index->def) != 0) { + free(rv); + return NULL; + } light_sequence_view_create(&rv->view, &sequence_data_index); return (struct index_read_view *)rv; }