diff --git a/src/box/memtx_bitset.cc b/src/box/memtx_bitset.cc index cbfb004cf805d5d4a458721d4449ba23ce373445..e3e7c718f785c7d55ef7075ce250b939e9c062aa 100644 --- a/src/box/memtx_bitset.cc +++ b/src/box/memtx_bitset.cc @@ -335,7 +335,6 @@ memtx_bitset_index_replace(struct index *base, struct tuple *old_tuple, return 0; } -template <bool UNCHANGED> static struct iterator * memtx_bitset_index_create_iterator(struct index *base, enum iterator_type type, const char *key, uint32_t part_count) @@ -357,7 +356,7 @@ memtx_bitset_index_create_iterator(struct index *base, enum iterator_type type, iterator_create(&it->base, base); it->pool = &memtx->iterator_pool; it->base.next_raw = bitset_index_iterator_next_raw; - it->base.next = UNCHANGED ? it->base.next_raw : memtx_iterator_next; + it->base.next = memtx_iterator_next; it->base.free = bitset_index_iterator_free; tt_bitset_iterator_create(&it->bitset_it, realloc); @@ -484,62 +483,36 @@ memtx_bitset_index_count(struct index *base, enum iterator_type type, return generic_index_count(base, type, key, part_count); } -/** - * Get index vtab by @a UNCHANGED, template version. - * If UNCHANGED == true iterator->next and index->get - * functions are the same as it's raw versions. - */ -template <bool UNCHANGED> -static const struct index_vtab * -get_memtx_bitset_index_vtab(void) -{ - static const struct index_vtab vtab = { - /* .destroy = */ memtx_bitset_index_destroy, - /* .commit_create = */ generic_index_commit_create, - /* .abort_create = */ generic_index_abort_create, - /* .commit_modify = */ generic_index_commit_modify, - /* .commit_drop = */ generic_index_commit_drop, - /* .update_def = */ generic_index_update_def, - /* .depends_on_pk = */ generic_index_depends_on_pk, - /* .def_change_requires_rebuild = */ - memtx_index_def_change_requires_rebuild, - /* .size = */ memtx_bitset_index_size, - /* .bsize = */ memtx_bitset_index_bsize, - /* .min = */ generic_index_min, - /* .max = */ generic_index_max, - /* .random = */ generic_index_random, - /* .count = */ memtx_bitset_index_count, - /* .get_raw = */ generic_index_get_raw, - /* .get = */ UNCHANGED ? generic_index_get_raw : - generic_index_get, - /* .replace = */ memtx_bitset_index_replace, - /* .create_iterator = */ - memtx_bitset_index_create_iterator<UNCHANGED>, - /* .create_snapshot_iterator = */ - generic_index_create_snapshot_iterator, - /* .stat = */ generic_index_stat, - /* .compact = */ generic_index_compact, - /* .reset_stat = */ generic_index_reset_stat, - /* .begin_build = */ generic_index_begin_build, - /* .reserve = */ generic_index_reserve, - /* .build_next = */ generic_index_build_next, - /* .end_build = */ generic_index_end_build, - }; - return &vtab; -} - -/** - * Get index vtab by @a unchanged, argument version. - */ -static const struct index_vtab * -get_memtx_bitset_index_vtab(bool unchanged) -{ - static const index_vtab *choice[2] = { - get_memtx_bitset_index_vtab<false>(), - get_memtx_bitset_index_vtab<true>() - }; - return choice[unchanged]; -} +static const struct index_vtab memtx_bitset_index_vtab = { + /* .destroy = */ memtx_bitset_index_destroy, + /* .commit_create = */ generic_index_commit_create, + /* .abort_create = */ generic_index_abort_create, + /* .commit_modify = */ generic_index_commit_modify, + /* .commit_drop = */ generic_index_commit_drop, + /* .update_def = */ generic_index_update_def, + /* .depends_on_pk = */ generic_index_depends_on_pk, + /* .def_change_requires_rebuild = */ + memtx_index_def_change_requires_rebuild, + /* .size = */ memtx_bitset_index_size, + /* .bsize = */ memtx_bitset_index_bsize, + /* .min = */ generic_index_min, + /* .max = */ generic_index_max, + /* .random = */ generic_index_random, + /* .count = */ memtx_bitset_index_count, + /* .get_raw = */ generic_index_get_raw, + /* .get = */ generic_index_get, + /* .replace = */ memtx_bitset_index_replace, + /* .create_iterator = */ memtx_bitset_index_create_iterator, + /* .create_snapshot_iterator = */ + generic_index_create_snapshot_iterator, + /* .stat = */ generic_index_stat, + /* .compact = */ generic_index_compact, + /* .reset_stat = */ generic_index_reset_stat, + /* .begin_build = */ generic_index_begin_build, + /* .reserve = */ generic_index_reserve, + /* .build_next = */ generic_index_build_next, + /* .end_build = */ generic_index_end_build, +}; struct index * memtx_bitset_index_new(struct memtx_engine *memtx, struct index_def *def) @@ -554,9 +527,8 @@ memtx_bitset_index_new(struct memtx_engine *memtx, struct index_def *def) "malloc", "struct memtx_bitset_index"); return NULL; } - const struct index_vtab *vtab = get_memtx_bitset_index_vtab(true); if (index_create(&index->base, (struct engine *)memtx, - vtab, def) != 0) { + &memtx_bitset_index_vtab, def) != 0) { free(index); return NULL; } @@ -575,9 +547,3 @@ memtx_bitset_index_new(struct memtx_engine *memtx, struct index_def *def) tt_bitset_index_create(&index->index, realloc); return &index->base; } - -void -memtx_bitset_index_set_vtab(struct index *index, bool unchanged) -{ - index->vtab = get_memtx_bitset_index_vtab(unchanged); -} diff --git a/src/box/memtx_bitset.h b/src/box/memtx_bitset.h index 80ed052bc29d1deb02f48032841ad0a5ec11d848..148d463d81612271ad7d6ae9033fb75017ebe799 100644 --- a/src/box/memtx_bitset.h +++ b/src/box/memtx_bitset.h @@ -42,15 +42,6 @@ struct memtx_engine; struct index * memtx_bitset_index_new(struct memtx_engine *memtx, struct index_def *def); -/** - * Change @a index vtab according to @a unchanged argument. - * If @a unchanged is false it's mean that tuple in index should - * be transformed before return it to user, so we need special - * `index_get` and `iterator_next` functions version. - */ -void -memtx_bitset_index_set_vtab(struct index *index, bool unchanged); - #if defined(__cplusplus) } /* extern "C" */ #endif /* defined(__cplusplus) */ diff --git a/src/box/memtx_engine.cc b/src/box/memtx_engine.cc index 2007514782a76825a84b8145f979f20404cb39bd..d81e937b63c167e37a8bad2668bd8a04bb4b66f2 100644 --- a/src/box/memtx_engine.cc +++ b/src/box/memtx_engine.cc @@ -535,8 +535,7 @@ memtx_engine_commit(struct engine *engine, struct txn *txn) struct memtx_space *mspace = (struct memtx_space *)stmt->space; size_t *bsize = &mspace->bsize; - uint64_t *ctuples = &mspace->compressed_tuples; - memtx_tx_history_commit_stmt(stmt, bsize, ctuples); + memtx_tx_history_commit_stmt(stmt, bsize); } } } @@ -586,7 +585,6 @@ memtx_engine_rollback_statement(struct engine *engine, struct txn *txn, } memtx_space_update_bsize(space, new_tuple, old_tuple); - memtx_space_update_compressed_tuples(space, new_tuple, old_tuple); if (old_tuple != NULL) tuple_ref(old_tuple); if (new_tuple != NULL) diff --git a/src/box/memtx_hash.cc b/src/box/memtx_hash.cc index 66dcd1945ff814d40e6085eecebba261b055c050..79825a0051680b6385f5dc860faa2bfe844e358a 100644 --- a/src/box/memtx_hash.cc +++ b/src/box/memtx_hash.cc @@ -102,7 +102,6 @@ hash_iterator_free(struct iterator *iterator) mempool_free(it->pool, it); } -template <bool UNCHANGED> static int hash_iterator_ge_raw_base(struct iterator *ptr, struct tuple **ret) { @@ -115,14 +114,11 @@ hash_iterator_ge_raw_base(struct iterator *ptr, struct tuple **ret) return 0; } -template <bool UNCHANGED> static int hash_iterator_gt_raw_base(struct iterator *ptr, struct tuple **ret) { assert(ptr->free == hash_iterator_free); - ptr->next_raw = hash_iterator_ge_raw_base<UNCHANGED>; - if (UNCHANGED) - ptr->next = ptr->next_raw; + ptr->next_raw = hash_iterator_ge_raw_base; struct hash_iterator *it = (struct hash_iterator *) ptr; struct memtx_hash_index *index = (struct memtx_hash_index *)ptr->index; struct tuple **res = light_index_iterator_get_and_next(&index->hash_table, @@ -135,7 +131,6 @@ hash_iterator_gt_raw_base(struct iterator *ptr, struct tuple **ret) } #define WRAP_ITERATOR_METHOD(name) \ -template <bool UNCHANGED> \ static int \ name(struct iterator *iterator, struct tuple **ret) \ { \ @@ -146,8 +141,8 @@ name(struct iterator *iterator, struct tuple **ret) \ bool is_first = true; \ do { \ int rc = is_first ? \ - name##_base<UNCHANGED>(iterator, ret) : \ - hash_iterator_ge_raw_base<UNCHANGED>(iterator, ret); \ + name##_base(iterator, ret) : \ + hash_iterator_ge_raw_base(iterator, ret); \ if (rc != 0 || *ret == NULL) \ return rc; \ is_first = false; \ @@ -169,15 +164,12 @@ tree_iterator_dummie(MAYBE_UNUSED struct iterator *it, struct tuple **ret) return 0; } -template <bool UNCHANGED> static int hash_iterator_raw_eq(struct iterator *it, struct tuple **ret) { it->next_raw = tree_iterator_dummie; - if (UNCHANGED) - it->next = it->next_raw; /* always returns zero. */ - hash_iterator_ge_raw_base<UNCHANGED>(it, ret); + hash_iterator_ge_raw_base(it, ret); if (*ret == NULL) return 0; struct txn *txn = in_txn(); @@ -413,7 +405,6 @@ memtx_hash_index_replace(struct index *base, struct tuple *old_tuple, return 0; } -template <bool UNCHANGED> static struct iterator * memtx_hash_index_create_iterator(struct index *base, enum iterator_type type, const char *key, uint32_t part_count) @@ -440,10 +431,10 @@ memtx_hash_index_create_iterator(struct index *base, enum iterator_type type, if (part_count != 0) { light_index_iterator_key(&index->hash_table, &it->iterator, key_hash(key, base->def->key_def), key); - it->base.next_raw = hash_iterator_gt_raw<UNCHANGED>; + it->base.next_raw = hash_iterator_gt_raw; } else { light_index_iterator_begin(&index->hash_table, &it->iterator); - it->base.next_raw = hash_iterator_ge_raw<UNCHANGED>; + it->base.next_raw = hash_iterator_ge_raw; } /* This iterator needs to be supported as a legacy. */ memtx_tx_track_full_scan(in_txn(), @@ -452,7 +443,7 @@ memtx_hash_index_create_iterator(struct index *base, enum iterator_type type, break; case ITER_ALL: light_index_iterator_begin(&index->hash_table, &it->iterator); - it->base.next_raw = hash_iterator_ge_raw<UNCHANGED>; + it->base.next_raw = hash_iterator_ge_raw; memtx_tx_track_full_scan(in_txn(), space_by_id(it->base.space_id), &index->base); @@ -461,7 +452,7 @@ memtx_hash_index_create_iterator(struct index *base, enum iterator_type type, assert(part_count > 0); light_index_iterator_key(&index->hash_table, &it->iterator, key_hash(key, base->def->key_def), key); - it->base.next_raw = hash_iterator_raw_eq<UNCHANGED>; + it->base.next_raw = hash_iterator_raw_eq; if (it->iterator.slotpos == light_index_end) memtx_tx_track_point(in_txn(), space_by_id(it->base.space_id), @@ -473,7 +464,7 @@ memtx_hash_index_create_iterator(struct index *base, enum iterator_type type, mempool_free(&memtx->iterator_pool, it); return NULL; } - it->base.next = UNCHANGED ? it->base.next_raw : memtx_iterator_next; + it->base.next = memtx_iterator_next; return (struct iterator *)it; } @@ -564,62 +555,36 @@ memtx_hash_index_create_snapshot_iterator(struct index *base) return (struct snapshot_iterator *) it; } -/** - * Get index vtab by @a UNCHANGED, template version. - * If UNCHANGED == true iterator->next and index->get - * functions are the same as it's raw versions. - */ -template <bool UNCHANGED> -static const struct index_vtab * -get_memtx_hash_index_vtab(void) -{ - static const struct index_vtab vtab = { - /* .destroy = */ memtx_hash_index_destroy, - /* .commit_create = */ generic_index_commit_create, - /* .abort_create = */ generic_index_abort_create, - /* .commit_modify = */ generic_index_commit_modify, - /* .commit_drop = */ generic_index_commit_drop, - /* .update_def = */ memtx_hash_index_update_def, - /* .depends_on_pk = */ generic_index_depends_on_pk, - /* .def_change_requires_rebuild = */ - memtx_index_def_change_requires_rebuild, - /* .size = */ memtx_hash_index_size, - /* .bsize = */ memtx_hash_index_bsize, - /* .min = */ generic_index_min, - /* .max = */ generic_index_max, - /* .random = */ memtx_hash_index_random, - /* .count = */ memtx_hash_index_count, - /* .get_raw = */ memtx_hash_index_get_raw, - /* .get = */ UNCHANGED ? memtx_hash_index_get_raw : - memtx_index_get, - /* .replace = */ memtx_hash_index_replace, - /* .create_iterator = */ - memtx_hash_index_create_iterator<UNCHANGED>, - /* .create_snapshot_iterator = */ - memtx_hash_index_create_snapshot_iterator, - /* .stat = */ generic_index_stat, - /* .compact = */ generic_index_compact, - /* .reset_stat = */ generic_index_reset_stat, - /* .begin_build = */ generic_index_begin_build, - /* .reserve = */ generic_index_reserve, - /* .build_next = */ generic_index_build_next, - /* .end_build = */ generic_index_end_build, - }; - return &vtab; -} - -/** - * Get index vtab by @a unchanged, argument version. - */ -static const struct index_vtab * -get_memtx_hash_index_vtab(bool unchanged) -{ - static const index_vtab *choice[2] = { - get_memtx_hash_index_vtab<false>(), - get_memtx_hash_index_vtab<true>() - }; - return choice[unchanged]; -} +static const struct index_vtab memtx_hash_index_vtab = { + /* .destroy = */ memtx_hash_index_destroy, + /* .commit_create = */ generic_index_commit_create, + /* .abort_create = */ generic_index_abort_create, + /* .commit_modify = */ generic_index_commit_modify, + /* .commit_drop = */ generic_index_commit_drop, + /* .update_def = */ memtx_hash_index_update_def, + /* .depends_on_pk = */ generic_index_depends_on_pk, + /* .def_change_requires_rebuild = */ + memtx_index_def_change_requires_rebuild, + /* .size = */ memtx_hash_index_size, + /* .bsize = */ memtx_hash_index_bsize, + /* .min = */ generic_index_min, + /* .max = */ generic_index_max, + /* .random = */ memtx_hash_index_random, + /* .count = */ memtx_hash_index_count, + /* .get_raw = */ memtx_hash_index_get_raw, + /* .get = */ memtx_index_get, + /* .replace = */ memtx_hash_index_replace, + /* .create_iterator = */ memtx_hash_index_create_iterator, + /* .create_snapshot_iterator = */ + memtx_hash_index_create_snapshot_iterator, + /* .stat = */ generic_index_stat, + /* .compact = */ generic_index_compact, + /* .reset_stat = */ generic_index_reset_stat, + /* .begin_build = */ generic_index_begin_build, + /* .reserve = */ generic_index_reserve, + /* .build_next = */ generic_index_build_next, + /* .end_build = */ generic_index_end_build, +}; struct index * memtx_hash_index_new(struct memtx_engine *memtx, struct index_def *def) @@ -631,9 +596,8 @@ memtx_hash_index_new(struct memtx_engine *memtx, struct index_def *def) "malloc", "struct memtx_hash_index"); return NULL; } - const struct index_vtab *vtab = get_memtx_hash_index_vtab(true); if (index_create(&index->base, (struct engine *)memtx, - vtab, def) != 0) { + &memtx_hash_index_vtab, def) != 0) { free(index); return NULL; } @@ -644,10 +608,4 @@ memtx_hash_index_new(struct memtx_engine *memtx, struct index_def *def) return &index->base; } -void -memtx_hash_index_set_vtab(struct index *index, bool unchanged) -{ - index->vtab = get_memtx_hash_index_vtab(unchanged); -} - /* }}} */ diff --git a/src/box/memtx_hash.h b/src/box/memtx_hash.h index a110ae71ea55effedff5555e6b858b5727158d19..2dba3f5c5b14ff787bbca46a53b0e2053dabf2c7 100644 --- a/src/box/memtx_hash.h +++ b/src/box/memtx_hash.h @@ -42,15 +42,6 @@ struct memtx_engine; struct index * memtx_hash_index_new(struct memtx_engine *memtx, struct index_def *def); -/** - * Change @a index vtab according to @a unchanged argument. - * If @a unchanged is false it's mean that tuple in index should - * be transformed before return it to user, so we need special - * `index_get` and `iterator_next` functions version. - */ -void -memtx_hash_index_set_vtab(struct index *index, bool unchanged); - #if defined(__cplusplus) } /* extern "C" */ #endif /* defined(__cplusplus) */ diff --git a/src/box/memtx_rtree.cc b/src/box/memtx_rtree.cc index 32f69e8f738a26964ab7ea5301e7afad85f84a89..69d57376d24e8ad441e14e080cbf57176efea38e 100644 --- a/src/box/memtx_rtree.cc +++ b/src/box/memtx_rtree.cc @@ -294,7 +294,6 @@ memtx_rtree_index_reserve(struct index *base, uint32_t size_hint) return memtx_index_extent_reserve(memtx, RESERVE_EXTENTS_BEFORE_REPLACE); } -template <bool UNCHANGED> static struct iterator * memtx_rtree_index_create_iterator(struct index *base, enum iterator_type type, const char *key, uint32_t part_count) @@ -356,8 +355,7 @@ memtx_rtree_index_create_iterator(struct index *base, enum iterator_type type, iterator_create(&it->base, base); it->pool = &memtx->rtree_iterator_pool; it->base.next_raw = index_rtree_iterator_next_raw; - it->base.next = UNCHANGED ? index_rtree_iterator_next_raw : - memtx_iterator_next; + it->base.next = memtx_iterator_next; it->base.free = index_rtree_iterator_free; rtree_iterator_init(&it->impl); /* @@ -371,62 +369,36 @@ memtx_rtree_index_create_iterator(struct index *base, enum iterator_type type, return (struct iterator *)it; } -/** - * Get index vtab by @a UNCHANGED, template version. - * If UNCHANGED == true iterator->next and index->get - * functions are the same as it's raw versions. - */ -template <bool UNCHANGED> -static const struct index_vtab * -get_memtx_rtree_index_vtab(void) -{ - static const struct index_vtab vtab = { - /* .destroy = */ memtx_rtree_index_destroy, - /* .commit_create = */ generic_index_commit_create, - /* .abort_create = */ generic_index_abort_create, - /* .commit_modify = */ generic_index_commit_modify, - /* .commit_drop = */ generic_index_commit_drop, - /* .update_def = */ generic_index_update_def, - /* .depends_on_pk = */ generic_index_depends_on_pk, - /* .def_change_requires_rebuild = */ - memtx_rtree_index_def_change_requires_rebuild, - /* .size = */ memtx_rtree_index_size, - /* .bsize = */ memtx_rtree_index_bsize, - /* .min = */ generic_index_min, - /* .max = */ generic_index_max, - /* .random = */ generic_index_random, - /* .count = */ memtx_rtree_index_count, - /* .get_raw = */ memtx_rtree_index_get_raw, - /* .get = */ UNCHANGED ? memtx_rtree_index_get_raw : - memtx_index_get, - /* .replace = */ memtx_rtree_index_replace, - /* .create_iterator = */ - memtx_rtree_index_create_iterator<UNCHANGED>, - /* .create_snapshot_iterator = */ - generic_index_create_snapshot_iterator, - /* .stat = */ generic_index_stat, - /* .compact = */ generic_index_compact, - /* .reset_stat = */ generic_index_reset_stat, - /* .begin_build = */ generic_index_begin_build, - /* .reserve = */ memtx_rtree_index_reserve, - /* .build_next = */ generic_index_build_next, - /* .end_build = */ generic_index_end_build, - }; - return &vtab; -} - -/** - * Get index vtab by @a unchanged, argument version. - */ -static const struct index_vtab * -get_memtx_rtree_index_vtab(bool unchanged) -{ - static const index_vtab *choice[2] = { - get_memtx_rtree_index_vtab<false>(), - get_memtx_rtree_index_vtab<true>() - }; - return choice[unchanged]; -} +static const struct index_vtab memtx_rtree_index_vtab = { + /* .destroy = */ memtx_rtree_index_destroy, + /* .commit_create = */ generic_index_commit_create, + /* .abort_create = */ generic_index_abort_create, + /* .commit_modify = */ generic_index_commit_modify, + /* .commit_drop = */ generic_index_commit_drop, + /* .update_def = */ generic_index_update_def, + /* .depends_on_pk = */ generic_index_depends_on_pk, + /* .def_change_requires_rebuild = */ + memtx_rtree_index_def_change_requires_rebuild, + /* .size = */ memtx_rtree_index_size, + /* .bsize = */ memtx_rtree_index_bsize, + /* .min = */ generic_index_min, + /* .max = */ generic_index_max, + /* .random = */ generic_index_random, + /* .count = */ memtx_rtree_index_count, + /* .get_raw = */ memtx_rtree_index_get_raw, + /* .get = */ memtx_index_get, + /* .replace = */ memtx_rtree_index_replace, + /* .create_iterator = */ memtx_rtree_index_create_iterator, + /* .create_snapshot_iterator = */ + generic_index_create_snapshot_iterator, + /* .stat = */ generic_index_stat, + /* .compact = */ generic_index_compact, + /* .reset_stat = */ generic_index_reset_stat, + /* .begin_build = */ generic_index_begin_build, + /* .reserve = */ memtx_rtree_index_reserve, + /* .build_next = */ generic_index_build_next, + /* .end_build = */ generic_index_end_build, +}; struct index * memtx_rtree_index_new(struct memtx_engine *memtx, struct index_def *def) @@ -463,9 +435,8 @@ memtx_rtree_index_new(struct memtx_engine *memtx, struct index_def *def) "malloc", "struct memtx_rtree_index"); return NULL; } - const struct index_vtab *vtab = get_memtx_rtree_index_vtab(true); if (index_create(&index->base, (struct engine *)memtx, - vtab, def) != 0) { + &memtx_rtree_index_vtab, def) != 0) { free(index); return NULL; } @@ -476,9 +447,3 @@ memtx_rtree_index_new(struct memtx_engine *memtx, struct index_def *def) distance_type); return &index->base; } - -void -memtx_rtree_index_set_vtab(struct index *index, bool unchanged) -{ - index->vtab = get_memtx_rtree_index_vtab(unchanged); -} diff --git a/src/box/memtx_rtree.h b/src/box/memtx_rtree.h index 82d75dc68ec388d3d3c90c990388db8bbdc25251..2941b805a0d74d8422917b9193c865ed18f60f20 100644 --- a/src/box/memtx_rtree.h +++ b/src/box/memtx_rtree.h @@ -42,15 +42,6 @@ struct memtx_engine; struct index * memtx_rtree_index_new(struct memtx_engine *memtx, struct index_def *def); -/** - * Change @a index vtab according to @a unchanged argument. - * If @a unchanged is false it's mean that tuple in index should - * be transformed before return it to user, so we need special - * `index_get` and `iterator_next` functions version. - */ -void -memtx_rtree_index_set_vtab(struct index *index, bool unchanged); - #if defined(__cplusplus) } /* extern "C" */ #endif /* defined(__cplusplus) */ diff --git a/src/box/memtx_space.c b/src/box/memtx_space.c index 38542612ca29e126eeabf0f897f59b078efac4a0..c3210d0ce1d9920c5681854bf0b1c1ef0cc65212 100644 --- a/src/box/memtx_space.c +++ b/src/box/memtx_space.c @@ -89,22 +89,6 @@ memtx_space_update_bsize(struct space *space, struct tuple *old_tuple, memtx_space->bsize += new_bsize - old_bsize; } -void -memtx_space_update_compressed_tuples(struct space *space, - struct tuple *old_tuple, - struct tuple *new_tuple) -{ - struct memtx_space *memtx_space = (struct memtx_space *)space; - uint64_t old_compressed_tuples = memtx_space->compressed_tuples; - if (old_tuple != NULL && tuple_is_compressed(old_tuple)) - memtx_space->compressed_tuples--; - if (new_tuple != NULL && tuple_is_compressed(new_tuple)) - memtx_space->compressed_tuples++; - if ((old_compressed_tuples != 0 && memtx_space->compressed_tuples == 0) || - (old_compressed_tuples == 0 && memtx_space->compressed_tuples != 0)) - memtx_space_update_indexes_vtab(space); -} - /** * A version of space_replace for a space which has * no indexes (is not yet fully built). @@ -150,7 +134,6 @@ memtx_space_replace_build_next(struct space *space, struct tuple *old_tuple, if (index_build_next(space->index[0], new_tuple) != 0) return -1; memtx_space_update_bsize(space, NULL, new_tuple); - memtx_space_update_compressed_tuples(space, NULL, new_tuple); tuple_ref(new_tuple); return 0; } @@ -170,7 +153,6 @@ memtx_space_replace_primary_key(struct space *space, struct tuple *old_tuple, new_tuple, mode, &old_tuple, &successor) != 0) return -1; memtx_space_update_bsize(space, old_tuple, new_tuple); - memtx_space_update_compressed_tuples(space, old_tuple, new_tuple); if (new_tuple != NULL) tuple_ref(new_tuple); *result = old_tuple; @@ -323,7 +305,6 @@ memtx_space_replace_all_keys(struct space *space, struct tuple *old_tuple, } memtx_space_update_bsize(space, old_tuple, new_tuple); - memtx_space_update_compressed_tuples(space, old_tuple, new_tuple); if (new_tuple != NULL) tuple_ref(new_tuple); *result = old_tuple; @@ -877,36 +858,6 @@ sequence_data_index_new(struct memtx_engine *memtx, struct index_def *def) return index; } -/** - * Update @a index vtab according to @a space format and count of - * compressed tuples in space. If there is no compressed tuples - * in space and current space format without compression we set - * vtab with `index_get` and `iterator_next` function versions - * same as it's raw analogs. Otherwise we set vtab with special - * versions of this functions. - */ -static void -memtx_space_update_index_vtab(struct space *space, struct index *index) -{ - if (space_is_system(space)) - return; - struct memtx_space *memtx_space = (struct memtx_space *)space; - bool unchanged = (!memtx_space->base.format->is_compressed && - memtx_space->compressed_tuples == 0); - switch (index->def->type) { - case HASH: - return memtx_hash_index_set_vtab(index, unchanged); - case TREE: - return memtx_tree_index_set_vtab(index, unchanged); - case RTREE: - return memtx_rtree_index_set_vtab(index, unchanged); - case BITSET: - return memtx_bitset_index_set_vtab(index, unchanged); - default: - unreachable(); - } -} - static struct index * memtx_space_create_index(struct space *space, struct index_def *index_def) { @@ -923,27 +874,19 @@ memtx_space_create_index(struct space *space, struct index_def *index_def) return sequence_data_index_new(memtx, index_def); } - struct index *index = NULL; switch (index_def->type) { case HASH: - index = memtx_hash_index_new(memtx, index_def); - break; + return memtx_hash_index_new(memtx, index_def); case TREE: - index = memtx_tree_index_new(memtx, index_def); - break; + return memtx_tree_index_new(memtx, index_def); case RTREE: - index = memtx_rtree_index_new(memtx, index_def); - break; + return memtx_rtree_index_new(memtx, index_def); case BITSET: - index = memtx_bitset_index_new(memtx, index_def); - break; + return memtx_bitset_index_new(memtx, index_def); default: unreachable(); return NULL; } - if (index != NULL) - memtx_space_update_index_vtab(space, index); - return index; } /** @@ -1101,7 +1044,6 @@ memtx_space_drop_primary_key(struct space *space) */ memtx_space->replace = memtx_space_replace_no_keys; memtx_space->bsize = 0; - memtx_space->compressed_tuples = 0; } static void @@ -1418,7 +1360,6 @@ memtx_space_prepare_alter(struct space *old_space, struct space *new_space) new_memtx_space->replace = old_memtx_space->replace; new_memtx_space->bsize = old_memtx_space->bsize; - new_memtx_space->compressed_tuples = old_memtx_space->compressed_tuples; return 0; } @@ -1486,14 +1427,6 @@ memtx_space_new(struct memtx_engine *memtx, memtx_space->bsize = 0; memtx_space->rowid = 0; - memtx_space->compressed_tuples = 0; memtx_space->replace = memtx_space_replace_no_keys; return (struct space *)memtx_space; } - -void -memtx_space_update_indexes_vtab(struct space *space) -{ - for (uint32_t i = 0; i < space->index_count; i++) - memtx_space_update_index_vtab(space, space->index[i]); -} diff --git a/src/box/memtx_space.h b/src/box/memtx_space.h index 23e948353df14a739ead546be59d221d9d5be6d5..a13dae7145af91fe31dfb22cfe77c6e16a9940c9 100644 --- a/src/box/memtx_space.h +++ b/src/box/memtx_space.h @@ -50,8 +50,6 @@ struct memtx_space { * tuples within one unique primary key. */ uint64_t rowid; - /** Count of compressed tuples contained in this space. */ - uint64_t compressed_tuples; /** * A pointer to replace function, set to different values * at different stages of recovery. @@ -73,18 +71,6 @@ void memtx_space_update_bsize(struct space *space, struct tuple *old_tuple, struct tuple *new_tuple); -/** - * Undate count of compressed tuples in @a space. If @a old_tuple - * is compressed wwe decrement count of compressed tuples. If @a - * new_tuple is compressed we increment count of compressed tuples. - * If count of compressed tuples is equal to zero we update vtabs - * of all space indexes. - */ -void -memtx_space_update_compressed_tuples(struct space *space, - struct tuple *old_tuple, - struct tuple *new_tuple); - int memtx_space_replace_no_keys(struct space *, struct tuple *, struct tuple *, enum dup_replace_mode, struct tuple **); @@ -102,13 +88,6 @@ struct space * memtx_space_new(struct memtx_engine *memtx, struct space_def *def, struct rlist *key_list); -/** - * Update vtabs of all indexes in @a space according to - * @a space format and count of compressed tuples. - */ -void -memtx_space_update_indexes_vtab(struct space *space); - static inline bool memtx_space_is_recovering(struct space *space) { diff --git a/src/box/memtx_tree.cc b/src/box/memtx_tree.cc index 9831c138772c68aaa774149f52ad9e8d13d35f92..8fcc16ff527c7d73f7c20fd12456f63bc7f7d2ea 100644 --- a/src/box/memtx_tree.cc +++ b/src/box/memtx_tree.cc @@ -355,16 +355,13 @@ tree_iterator_dummie(struct iterator *iterator, struct tuple **ret) return 0; } -template <bool UNCHANGED> void tree_iterator_set_dummie(struct iterator *iterator) { iterator->next_raw = tree_iterator_dummie; - if (UNCHANGED) - iterator->next = tree_iterator_dummie; } -template <bool UNCHANGED, bool USE_HINT> +template <bool USE_HINT> static int tree_iterator_next_raw_base(struct iterator *iterator, struct tuple **ret) { @@ -385,7 +382,7 @@ tree_iterator_next_raw_base(struct iterator *iterator, struct tuple **ret) tree_iterator_set_current<USE_HINT>(it, res); *ret = it->current.tuple; if (*ret == NULL) - tree_iterator_set_dummie<UNCHANGED>(iterator); + tree_iterator_set_dummie(iterator); struct index *idx = iterator->index; struct space *space = space_by_id(iterator->space_id); @@ -400,7 +397,7 @@ tree_iterator_next_raw_base(struct iterator *iterator, struct tuple **ret) return 0; } -template <bool UNCHANGED, bool USE_HINT> +template <bool USE_HINT> static int tree_iterator_prev_raw_base(struct iterator *iterator, struct tuple **ret) { @@ -422,7 +419,7 @@ tree_iterator_prev_raw_base(struct iterator *iterator, struct tuple **ret) tree_iterator_set_current<USE_HINT>(it, res); *ret = it->current.tuple; if (*ret == NULL) - tree_iterator_set_dummie<UNCHANGED>(iterator); + tree_iterator_set_dummie(iterator); struct index *idx = iterator->index; struct space *space = space_by_id(iterator->space_id); @@ -438,7 +435,7 @@ tree_iterator_prev_raw_base(struct iterator *iterator, struct tuple **ret) return 0; } -template <bool UNCHANGED, bool USE_HINT> +template <bool USE_HINT> static int tree_iterator_next_equal_raw_base(struct iterator *iterator, struct tuple **ret) { @@ -466,7 +463,7 @@ tree_iterator_next_equal_raw_base(struct iterator *iterator, struct tuple **ret) it->key_data.hint, index->base.def->key_def) != 0) { tree_iterator_set_current<USE_HINT>(it, NULL); - tree_iterator_set_dummie<UNCHANGED>(iterator); + tree_iterator_set_dummie(iterator); *ret = NULL; /* * Got end of key. Store gap from the previous tuple to the @@ -494,7 +491,7 @@ tree_iterator_next_equal_raw_base(struct iterator *iterator, struct tuple **ret) return 0; } -template <bool UNCHANGED, bool USE_HINT> +template <bool USE_HINT> static int tree_iterator_prev_equal_raw_base(struct iterator *iterator, struct tuple **ret) { @@ -523,7 +520,7 @@ tree_iterator_prev_equal_raw_base(struct iterator *iterator, struct tuple **ret) it->key_data.hint, index->base.def->key_def) != 0) { tree_iterator_set_current<USE_HINT>(it, NULL); - tree_iterator_set_dummie<UNCHANGED>(iterator); + tree_iterator_set_dummie(iterator); *ret = NULL; /********MVCC TRANSACTION MANAGER STORY GARBAGE COLLECTION BOUND START*********/ @@ -552,7 +549,7 @@ tree_iterator_prev_equal_raw_base(struct iterator *iterator, struct tuple **ret) } #define WRAP_ITERATOR_METHOD(name) \ -template <bool UNCHANGED, bool USE_HINT> \ +template <bool USE_HINT> \ static int \ name(struct iterator *iterator, struct tuple **ret) \ { \ @@ -567,7 +564,7 @@ name(struct iterator *iterator, struct tuple **ret) \ struct space *space = space_by_id(iterator->space_id); \ bool is_rw = txn != NULL; \ do { \ - int rc = name##_base<UNCHANGED, USE_HINT>(iterator, ret); \ + int rc = name##_base<USE_HINT>(iterator, ret); \ if (rc != 0 || *ret == NULL) \ return rc; \ uint32_t mk_index = 0; \ @@ -592,43 +589,37 @@ WRAP_ITERATOR_METHOD(tree_iterator_prev_equal_raw); #undef WRAP_ITERATOR_METHOD -template <bool UNCHANGED, bool USE_HINT> +template <bool USE_HINT> static void tree_iterator_set_next_method(struct tree_iterator<USE_HINT> *it) { assert(it->current.tuple != NULL); switch (it->type) { case ITER_EQ: - it->base.next_raw = - tree_iterator_next_equal_raw<UNCHANGED, USE_HINT>; + it->base.next_raw = tree_iterator_next_equal_raw<USE_HINT>; break; case ITER_REQ: - it->base.next_raw = - tree_iterator_prev_equal_raw<UNCHANGED, USE_HINT>; + it->base.next_raw = tree_iterator_prev_equal_raw<USE_HINT>; break; case ITER_ALL: - it->base.next_raw = - tree_iterator_next_raw<UNCHANGED, USE_HINT>; + it->base.next_raw = tree_iterator_next_raw<USE_HINT>; break; case ITER_LT: case ITER_LE: - it->base.next_raw = - tree_iterator_prev_raw<UNCHANGED, USE_HINT>; + it->base.next_raw = tree_iterator_prev_raw<USE_HINT>; break; case ITER_GE: case ITER_GT: - it->base.next_raw = - tree_iterator_next_raw<UNCHANGED, USE_HINT>; + it->base.next_raw = tree_iterator_next_raw<USE_HINT>; break; default: /* The type was checked in initIterator */ assert(false); } - it->base.next = UNCHANGED ? - it->base.next_raw : memtx_iterator_next; + it->base.next = memtx_iterator_next; } -template <bool UNCHANGED, bool USE_HINT> +template <bool USE_HINT> static int tree_iterator_start_raw(struct iterator *iterator, struct tuple **ret) { @@ -636,7 +627,7 @@ tree_iterator_start_raw(struct iterator *iterator, struct tuple **ret) struct memtx_tree_index<USE_HINT> *index = (struct memtx_tree_index<USE_HINT> *)iterator->index; struct tree_iterator<USE_HINT> *it = get_tree_iterator<USE_HINT>(iterator); - tree_iterator_set_dummie<UNCHANGED>(iterator); + tree_iterator_set_dummie(iterator); memtx_tree_t<USE_HINT> *tree = &index->tree; enum iterator_type type = it->type; struct txn *txn = in_txn(); @@ -709,7 +700,7 @@ tree_iterator_start_raw(struct iterator *iterator, struct tuple **ret) if (res != NULL) { *ret = res->tuple; tree_iterator_set_current(it, res); - tree_iterator_set_next_method<UNCHANGED>(it); + tree_iterator_set_next_method(it); bool is_multikey = iterator->index->def->key_def->is_multikey; mk_index = is_multikey ? (uint32_t)res->hint : 0; } @@ -1407,7 +1398,7 @@ memtx_tree_func_index_replace(struct index *base, struct tuple *old_tuple, return rc; } -template <bool UNCHANGED, bool USE_HINT> +template <bool USE_HINT> static struct iterator * memtx_tree_index_create_iterator(struct index *base, enum iterator_type type, const char *key, uint32_t part_count) @@ -1442,8 +1433,8 @@ memtx_tree_index_create_iterator(struct index *base, enum iterator_type type, } iterator_create(&it->base, base); it->pool = &memtx->iterator_pool; - it->base.next_raw = tree_iterator_start_raw<UNCHANGED, USE_HINT>; - it->base.next = UNCHANGED ? it->base.next_raw : memtx_iterator_next; + it->base.next_raw = tree_iterator_start_raw<USE_HINT>; + it->base.next = memtx_iterator_next; it->base.free = tree_iterator_free<USE_HINT>; it->type = type; it->key_data.key = key; @@ -1803,12 +1794,10 @@ enum memtx_tree_vtab_type { }; /** - * Get index vtab by @a TYPE, @a UNCHANGED and @a USE_HINT, template - * version. USE_HINT == false is only allowed for general index type. - * If UNCHANGED == true iterator->next and index->get functions are - * the same as it's raw versions. + * Get index vtab by @a TYPE and @a USE_HINT, template version. + * USE_HINT == false is only allowed for general index type. */ -template <memtx_tree_vtab_type TYPE, bool UNCHANGED, bool USE_HINT = true> +template <memtx_tree_vtab_type TYPE, bool USE_HINT = true> static const struct index_vtab * get_memtx_tree_index_vtab(void) { @@ -1837,13 +1826,12 @@ get_memtx_tree_index_vtab(void) /* .random = */ memtx_tree_index_random<USE_HINT>, /* .count = */ memtx_tree_index_count<USE_HINT>, /* .get_raw */ memtx_tree_index_get_raw<USE_HINT>, - /* .get = */ UNCHANGED ? memtx_tree_index_get_raw<USE_HINT> : - memtx_index_get, + /* .get = */ memtx_index_get, /* .replace = */ is_mk ? memtx_tree_index_replace_multikey : is_func ? memtx_tree_func_index_replace : memtx_tree_index_replace<USE_HINT>, /* .create_iterator = */ - memtx_tree_index_create_iterator<UNCHANGED, USE_HINT>, + memtx_tree_index_create_iterator<USE_HINT>, /* .create_snapshot_iterator = */ memtx_tree_index_create_snapshot_iterator<USE_HINT>, /* .stat = */ generic_index_stat, @@ -1859,35 +1847,6 @@ get_memtx_tree_index_vtab(void) return &vtab; } -/** - * Get index vtab by @a type and @a use_hint, argument version. - * @a use_hint is ignored for every type except MEMTX_TREE_VTAB_GENERAL. - */ -static const struct index_vtab * -get_memtx_tree_index_vtab(memtx_tree_vtab_type type, bool unchanged, - bool use_hint) -{ - static const index_vtab *choice[MEMTX_TREE_VTAB_TYPE_COUNT][2][2] = { - {{get_memtx_tree_index_vtab<MEMTX_TREE_VTAB_GENERAL, false, false>(), - get_memtx_tree_index_vtab<MEMTX_TREE_VTAB_GENERAL, false, true>()}, - {get_memtx_tree_index_vtab<MEMTX_TREE_VTAB_GENERAL, true, false>(), - get_memtx_tree_index_vtab<MEMTX_TREE_VTAB_GENERAL, true, true>()}}, - {{get_memtx_tree_index_vtab<MEMTX_TREE_VTAB_MULTIKEY, false>(), - get_memtx_tree_index_vtab<MEMTX_TREE_VTAB_MULTIKEY, false>()}, - {get_memtx_tree_index_vtab<MEMTX_TREE_VTAB_MULTIKEY, true>(), - get_memtx_tree_index_vtab<MEMTX_TREE_VTAB_MULTIKEY, true>()}}, - {{get_memtx_tree_index_vtab<MEMTX_TREE_VTAB_FUNC, false>(), - get_memtx_tree_index_vtab<MEMTX_TREE_VTAB_FUNC, false>()}, - {get_memtx_tree_index_vtab<MEMTX_TREE_VTAB_FUNC, true>(), - get_memtx_tree_index_vtab<MEMTX_TREE_VTAB_FUNC, true>()}}, - {{get_memtx_tree_index_vtab<MEMTX_TREE_VTAB_DISABLED, false>(), - get_memtx_tree_index_vtab<MEMTX_TREE_VTAB_DISABLED, false>()}, - {get_memtx_tree_index_vtab<MEMTX_TREE_VTAB_DISABLED, true>(), - get_memtx_tree_index_vtab<MEMTX_TREE_VTAB_DISABLED, true>()}} - }; - return choice[type][unchanged][use_hint]; -} - template <bool USE_HINT> static struct index * memtx_tree_index_new_tpl(struct memtx_engine *memtx, struct index_def *def, @@ -1917,44 +1876,33 @@ memtx_tree_index_new_tpl(struct memtx_engine *memtx, struct index_def *def, return &index->base; } -static void -memtx_tree_choose_type_and_hint(struct index_def *def, - memtx_tree_vtab_type *type, - bool *use_hint) +struct index * +memtx_tree_index_new(struct memtx_engine *memtx, struct index_def *def) { - *type = MEMTX_TREE_VTAB_GENERAL; - *use_hint = true; /* Force hints for multikey and func indexes. */ + bool use_hint = false; + const struct index_vtab *vtab; if (def->key_def->for_func_index) { - if (def->key_def->func_index_func == NULL) - *type = MEMTX_TREE_VTAB_DISABLED; - else - *type = MEMTX_TREE_VTAB_FUNC; + if (def->key_def->func_index_func != NULL) { + vtab = get_memtx_tree_index_vtab + <MEMTX_TREE_VTAB_FUNC>(); + use_hint = true; + } else { + vtab = get_memtx_tree_index_vtab + <MEMTX_TREE_VTAB_DISABLED>(); + } } else if (def->key_def->is_multikey) { - *type = MEMTX_TREE_VTAB_MULTIKEY; + vtab = get_memtx_tree_index_vtab<MEMTX_TREE_VTAB_MULTIKEY>(); + use_hint = true; + } else if (def->opts.hint) { + vtab = get_memtx_tree_index_vtab + <MEMTX_TREE_VTAB_GENERAL, true>(); + use_hint = true; } else { - *use_hint = def->opts.hint; + vtab = get_memtx_tree_index_vtab + <MEMTX_TREE_VTAB_GENERAL, false>(); } -} - -struct index * -memtx_tree_index_new(struct memtx_engine *memtx, struct index_def *def) -{ - const struct index_vtab *vtab; - memtx_tree_vtab_type type; - bool use_hint; - memtx_tree_choose_type_and_hint(def, &type, &use_hint); - vtab = get_memtx_tree_index_vtab(type, true, use_hint); if (use_hint) return memtx_tree_index_new_tpl<true>(memtx, def, vtab); else return memtx_tree_index_new_tpl<false>(memtx, def, vtab); } - -void -memtx_tree_index_set_vtab(struct index *index, bool unchanged) -{ - memtx_tree_vtab_type type; - bool use_hint; - memtx_tree_choose_type_and_hint(index->def, &type, &use_hint); - index->vtab = get_memtx_tree_index_vtab(type, unchanged, use_hint); -} diff --git a/src/box/memtx_tree.h b/src/box/memtx_tree.h index 5c9c5ab9a09f3e433f167e30d958e9c4fc38c20c..edeaebab93b69fef4f62f6c205d98653f1ac06c0 100644 --- a/src/box/memtx_tree.h +++ b/src/box/memtx_tree.h @@ -42,15 +42,6 @@ struct memtx_engine; struct index * memtx_tree_index_new(struct memtx_engine *memtx, struct index_def *def); -/** - * Change @a index vtab according to @a unchanged argument. - * If @a unchanged is false it's mean that tuple in index should - * be transformed before return it to user, so we need special - * `index_get` and `iterator_next` functions version. - */ -void -memtx_tree_index_set_vtab(struct index *index, bool unchanged); - #if defined(__cplusplus) } /* extern "C" */ #endif /* defined(__cplusplus) */ diff --git a/src/box/memtx_tx.c b/src/box/memtx_tx.c index 7dcc016e563eccea1b3b7b5ec3c20b84893d7c18..a66853fe5acfcc1968f033f229c821911d026660 100644 --- a/src/box/memtx_tx.c +++ b/src/box/memtx_tx.c @@ -1884,20 +1884,15 @@ memtx_tx_history_prepare_stmt(struct txn_stmt *stmt) } void -memtx_tx_history_commit_stmt(struct txn_stmt *stmt, size_t *bsize, - uint64_t *compressed_tuples) +memtx_tx_history_commit_stmt(struct txn_stmt *stmt, size_t *bsize) { if (stmt->add_story != NULL) { assert(stmt->add_story->add_stmt == stmt); *bsize += tuple_bsize(stmt->add_story->tuple); - if (tuple_is_compressed(stmt->add_story->tuple)) - (*compressed_tuples)++; memtx_tx_story_unlink_added_by(stmt->add_story, stmt); } if (stmt->del_story != NULL) { *bsize -= tuple_bsize(stmt->del_story->tuple); - if (tuple_is_compressed(stmt->del_story->tuple)) - (*compressed_tuples)--; memtx_tx_story_unlink_deleted_by(stmt->del_story, stmt); } } diff --git a/src/box/memtx_tx.h b/src/box/memtx_tx.h index abd13e45265d84a6ea609db11eeec6315c583aab..36e529b6019ea6c1d02115cad04448b8266f5edc 100644 --- a/src/box/memtx_tx.h +++ b/src/box/memtx_tx.h @@ -278,11 +278,9 @@ memtx_tx_history_prepare_stmt(struct txn_stmt *stmt); * * @param stmt current statement. * @param bsize the space bsize. - * @param compressed_tuples count of compressed tuples in space. */ void -memtx_tx_history_commit_stmt(struct txn_stmt *stmt, size_t *bsize, - uint64_t *compressed_tuples); +memtx_tx_history_commit_stmt(struct txn_stmt *stmt, size_t *bsize); /** Helper of memtx_tx_tuple_clarify */ struct tuple *