[PATCH 6/8] vinyl: zap vy_stmt_column_mask and mem_format_with_colmask
Vladimir Davydov
vdavydov.dev at gmail.com
Sun Oct 14 21:16:50 MSK 2018
Finally, these atrocities are not used anywhere and can be removed.
---
src/box/vinyl.c | 41 ++++++++++----------------------------
src/box/vy_lsm.c | 25 +++++------------------
src/box/vy_lsm.h | 8 --------
src/box/vy_mem.c | 14 ++++---------
src/box/vy_mem.h | 17 +++++++---------
src/box/vy_stmt.c | 12 -----------
src/box/vy_stmt.h | 44 -----------------------------------------
test/unit/vy_iterators_helper.c | 8 +-------
test/unit/vy_point_lookup.c | 11 ++++-------
9 files changed, 31 insertions(+), 149 deletions(-)
diff --git a/src/box/vinyl.c b/src/box/vinyl.c
index 4e6c5d56..c1e70cb2 100644
--- a/src/box/vinyl.c
+++ b/src/box/vinyl.c
@@ -1138,8 +1138,6 @@ vinyl_space_swap_index(struct space *old_space, struct space *new_space,
SWAP(old_lsm, new_lsm);
SWAP(old_lsm->check_is_unique, new_lsm->check_is_unique);
SWAP(old_lsm->mem_format, new_lsm->mem_format);
- SWAP(old_lsm->mem_format_with_colmask,
- new_lsm->mem_format_with_colmask);
SWAP(old_lsm->disk_format, new_lsm->disk_format);
SWAP(old_lsm->opts, new_lsm->opts);
key_def_swap(old_lsm->key_def, new_lsm->key_def);
@@ -1737,12 +1735,10 @@ vy_perform_update(struct vy_env *env, struct vy_tx *tx, struct txn_stmt *stmt,
if (space->index_count == 1)
return 0;
- struct tuple *delete;
- delete = vy_stmt_new_surrogate_delete(pk->mem_format_with_colmask,
- stmt->old_tuple);
+ struct tuple *delete = vy_stmt_new_surrogate_delete(pk->mem_format,
+ stmt->old_tuple);
if (delete == NULL)
return -1;
- vy_stmt_set_column_mask(delete, column_mask);
for (uint32_t i = 1; i < space->index_count; ++i) {
struct vy_lsm *lsm = vy_lsm(space->index[i]);
@@ -1821,19 +1817,10 @@ vy_update(struct vy_env *env, struct vy_tx *tx, struct txn_stmt *stmt,
*/
if (tuple_validate_raw(pk->mem_format, new_tuple))
return -1;
-
- if (space->index_count == 1) {
- stmt->new_tuple = vy_stmt_new_replace(pk->mem_format, new_tuple,
- new_tuple_end);
- if (stmt->new_tuple == NULL)
- return -1;
- } else {
- stmt->new_tuple = vy_stmt_new_replace(pk->mem_format_with_colmask,
- new_tuple, new_tuple_end);
- if (stmt->new_tuple == NULL)
- return -1;
- vy_stmt_set_column_mask(stmt->new_tuple, column_mask);
- }
+ stmt->new_tuple = vy_stmt_new_replace(pk->mem_format, new_tuple,
+ new_tuple_end);
+ if (stmt->new_tuple == NULL)
+ return -1;
if (vy_check_update(space, pk, stmt->old_tuple, stmt->new_tuple,
column_mask) != 0)
return -1;
@@ -2070,18 +2057,10 @@ vy_upsert(struct vy_env *env, struct vy_tx *tx, struct txn_stmt *stmt,
if (tuple_validate_raw(pk->mem_format, new_tuple))
return -1;
new_tuple_end = new_tuple + new_size;
- if (space->index_count == 1) {
- stmt->new_tuple = vy_stmt_new_replace(pk->mem_format, new_tuple,
- new_tuple_end);
- if (stmt->new_tuple == NULL)
- return -1;
- } else {
- stmt->new_tuple = vy_stmt_new_replace(pk->mem_format_with_colmask,
- new_tuple, new_tuple_end);
- if (stmt->new_tuple == NULL)
- return -1;
- vy_stmt_set_column_mask(stmt->new_tuple, column_mask);
- }
+ stmt->new_tuple = vy_stmt_new_replace(pk->mem_format, new_tuple,
+ new_tuple_end);
+ if (stmt->new_tuple == NULL)
+ return -1;
if (vy_check_update(space, pk, stmt->old_tuple, stmt->new_tuple,
column_mask) != 0) {
diag_log();
diff --git a/src/box/vy_lsm.c b/src/box/vy_lsm.c
index de5ad314..80341267 100644
--- a/src/box/vy_lsm.c
+++ b/src/box/vy_lsm.c
@@ -161,16 +161,6 @@ vy_lsm_new(struct vy_lsm_env *lsm_env, struct vy_cache_env *cache_env,
}
tuple_format_ref(lsm->disk_format);
- if (index_def->iid == 0) {
- lsm->mem_format_with_colmask =
- vy_tuple_format_new_with_colmask(format);
- if (lsm->mem_format_with_colmask == NULL)
- goto fail_mem_format_with_colmask;
- } else {
- lsm->mem_format_with_colmask = pk->mem_format_with_colmask;
- }
- tuple_format_ref(lsm->mem_format_with_colmask);
-
if (vy_lsm_stat_create(&lsm->stat) != 0)
goto fail_stat;
@@ -178,8 +168,8 @@ vy_lsm_new(struct vy_lsm_env *lsm_env, struct vy_cache_env *cache_env,
if (lsm->run_hist == NULL)
goto fail_run_hist;
- lsm->mem = vy_mem_new(mem_env, *lsm->env->p_generation,
- cmp_def, format, lsm->mem_format_with_colmask,
+ lsm->mem = vy_mem_new(mem_env, cmp_def, format,
+ *lsm->env->p_generation,
space_cache_version);
if (lsm->mem == NULL)
goto fail_mem;
@@ -215,8 +205,6 @@ fail_mem:
fail_run_hist:
vy_lsm_stat_destroy(&lsm->stat);
fail_stat:
- tuple_format_unref(lsm->mem_format_with_colmask);
-fail_mem_format_with_colmask:
tuple_format_unref(lsm->disk_format);
fail_format:
key_def_delete(cmp_def);
@@ -270,7 +258,6 @@ vy_lsm_delete(struct vy_lsm *lsm)
vy_range_tree_iter(lsm->tree, NULL, vy_range_tree_free_cb, NULL);
vy_range_heap_destroy(&lsm->range_heap);
tuple_format_unref(lsm->disk_format);
- tuple_format_unref(lsm->mem_format_with_colmask);
key_def_delete(lsm->cmp_def);
key_def_delete(lsm->key_def);
histogram_delete(lsm->run_hist);
@@ -807,9 +794,8 @@ vy_lsm_rotate_mem(struct vy_lsm *lsm)
struct vy_mem *mem;
assert(lsm->mem != NULL);
- mem = vy_mem_new(lsm->mem->env, *lsm->env->p_generation,
- lsm->cmp_def, lsm->mem_format,
- lsm->mem_format_with_colmask, space_cache_version);
+ mem = vy_mem_new(lsm->mem->env, lsm->cmp_def, lsm->mem_format,
+ *lsm->env->p_generation, space_cache_version);
if (mem == NULL)
return -1;
@@ -857,8 +843,7 @@ vy_lsm_set(struct vy_lsm *lsm, struct vy_mem *mem,
lsm->stat.memory.count.bytes += tuple_size(stmt);
/* Abort transaction if format was changed by DDL */
- if (format_id != tuple_format_id(mem->format_with_colmask) &&
- format_id != tuple_format_id(mem->format)) {
+ if (format_id != tuple_format_id(mem->format)) {
diag_set(ClientError, ER_TRANSACTION_CONFLICT);
return -1;
}
diff --git a/src/box/vy_lsm.h b/src/box/vy_lsm.h
index 2e026ced..d8d9f9d0 100644
--- a/src/box/vy_lsm.h
+++ b/src/box/vy_lsm.h
@@ -193,14 +193,6 @@ struct vy_lsm {
/** Tuple format of the space this LSM tree belongs to. */
struct tuple_format *mem_format;
/**
- * Format for tuples of type REPLACE or DELETE which
- * are a result of an UPDATE operation. Such tuples
- * contain a column mask which preserves the list
- * of actually changed columns. Used when creating
- * tuples for vy_mem, and used only by primary key.
- */
- struct tuple_format *mem_format_with_colmask;
- /**
* If this LSM tree is for a secondary index, the following
* variable points to the LSM tree of the primary index of
* the same space, otherwise it is set to NULL. Referenced
diff --git a/src/box/vy_mem.c b/src/box/vy_mem.c
index ccd079f0..f8b89d4e 100644
--- a/src/box/vy_mem.c
+++ b/src/box/vy_mem.c
@@ -96,9 +96,8 @@ vy_mem_tree_extent_free(void *ctx, void *p)
}
struct vy_mem *
-vy_mem_new(struct vy_mem_env *env, int64_t generation,
- struct key_def *cmp_def, struct tuple_format *format,
- struct tuple_format *format_with_colmask,
+vy_mem_new(struct vy_mem_env *env, struct key_def *cmp_def,
+ struct tuple_format *format, int64_t generation,
uint32_t space_cache_version)
{
struct vy_mem *index = calloc(1, sizeof(*index));
@@ -114,8 +113,6 @@ vy_mem_new(struct vy_mem_env *env, int64_t generation,
index->space_cache_version = space_cache_version;
index->format = format;
tuple_format_ref(format);
- index->format_with_colmask = format_with_colmask;
- tuple_format_ref(format_with_colmask);
vy_mem_tree_create(&index->tree, cmp_def,
vy_mem_tree_extent_alloc,
vy_mem_tree_extent_free, index);
@@ -129,7 +126,6 @@ vy_mem_delete(struct vy_mem *index)
{
index->env->tree_extent_size -= index->tree_extent_size;
tuple_format_unref(index->format);
- tuple_format_unref(index->format_with_colmask);
fiber_cond_destroy(&index->pin_cond);
TRASH(index);
free(index);
@@ -160,8 +156,7 @@ vy_mem_insert_upsert(struct vy_mem *mem, const struct tuple *stmt)
{
assert(vy_stmt_type(stmt) == IPROTO_UPSERT);
/* Check if the statement can be inserted in the vy_mem. */
- assert(stmt->format_id == tuple_format_id(mem->format_with_colmask) ||
- stmt->format_id == tuple_format_id(mem->format));
+ assert(stmt->format_id == tuple_format_id(mem->format));
/* The statement must be from a lsregion. */
assert(!vy_stmt_is_refable(stmt));
size_t size = tuple_size(stmt);
@@ -220,8 +215,7 @@ vy_mem_insert(struct vy_mem *mem, const struct tuple *stmt)
{
assert(vy_stmt_type(stmt) != IPROTO_UPSERT);
/* Check if the statement can be inserted in the vy_mem. */
- assert(stmt->format_id == tuple_format_id(mem->format_with_colmask) ||
- stmt->format_id == tuple_format_id(mem->format));
+ assert(stmt->format_id == tuple_format_id(mem->format));
/* The statement must be from a lsregion. */
assert(!vy_stmt_is_refable(stmt));
size_t size = tuple_size(stmt);
diff --git a/src/box/vy_mem.h b/src/box/vy_mem.h
index d6afeed1..b41c3c0b 100644
--- a/src/box/vy_mem.h
+++ b/src/box/vy_mem.h
@@ -194,12 +194,12 @@ struct vy_mem {
*/
int64_t generation;
/**
- * Format of vy_mem REPLACE and DELETE tuples without
- * column mask.
+ * Format of statements stored in this in-memory index.
+ * Note, the statements don't reference the format by
+ * themselves, instead it is referenced once by vy_mem.
+ * This allows us to drop vy_mem in O(1).
*/
struct tuple_format *format;
- /** Format of vy_mem tuples with column mask. */
- struct tuple_format *format_with_colmask;
/**
* Number of active writers to this index.
*
@@ -254,19 +254,16 @@ vy_mem_wait_pinned(struct vy_mem *mem)
* Instantiate a new in-memory level.
*
* @param env Vinyl memory environment.
- * @param generation Generation of statements stored in the tree.
* @param key_def key definition.
* @param format Format for REPLACE and DELETE tuples.
- * @param format_with_colmask Format for tuples, which have
- * column mask.
+ * @param generation Generation of statements stored in the tree.
* @param space_cache_version Data dictionary cache version
* @retval new vy_mem instance on success.
* @retval NULL on error, check diag.
*/
struct vy_mem *
-vy_mem_new(struct vy_mem_env *env, int64_t generation,
- struct key_def *cmp_def, struct tuple_format *format,
- struct tuple_format *format_with_colmask,
+vy_mem_new(struct vy_mem_env *env, struct key_def *cmp_def,
+ struct tuple_format *format, int64_t generation,
uint32_t space_cache_version);
/**
diff --git a/src/box/vy_stmt.c b/src/box/vy_stmt.c
index bb9e1edb..7082952b 100644
--- a/src/box/vy_stmt.c
+++ b/src/box/vy_stmt.c
@@ -748,15 +748,3 @@ vy_stmt_str(const struct tuple *stmt)
return "<failed to format statement>";
return buf;
}
-
-struct tuple_format *
-vy_tuple_format_new_with_colmask(struct tuple_format *mem_format)
-{
- struct tuple_format *format = tuple_format_dup(mem_format);
- if (format == NULL)
- return NULL;
- /* + size of column mask. */
- assert(format->extra_size == 0);
- format->extra_size = sizeof(uint64_t);
- return format;
-}
diff --git a/src/box/vy_stmt.h b/src/box/vy_stmt.h
index 4a67b3c7..c3381402 100644
--- a/src/box/vy_stmt.h
+++ b/src/box/vy_stmt.h
@@ -219,39 +219,6 @@ vy_stmt_set_n_upserts(struct tuple *stmt, uint8_t n)
*((uint8_t *)stmt - 1) = n;
}
-/** Get the column mask of the specified tuple. */
-static inline uint64_t
-vy_stmt_column_mask(const struct tuple *tuple)
-{
- enum iproto_type type = vy_stmt_type(tuple);
- assert(type == IPROTO_INSERT || type == IPROTO_REPLACE ||
- type == IPROTO_DELETE);
- (void) type;
- if (tuple_format(tuple)->extra_size == sizeof(uint64_t)) {
- /* Tuple has column mask */
- const char *extra = tuple_extra(tuple);
- return load_u64(extra);
- }
- return UINT64_MAX; /* return default value */
-}
-
-/**
- * Set the column mask in the tuple.
- * @param tuple Tuple to set column mask.
- * @param column_mask Bitmask of the updated columns.
- */
-static inline void
-vy_stmt_set_column_mask(struct tuple *tuple, uint64_t column_mask)
-{
- enum iproto_type type = vy_stmt_type(tuple);
- assert(type == IPROTO_INSERT || type == IPROTO_REPLACE ||
- type == IPROTO_DELETE);
- assert(tuple_format(tuple)->extra_size == sizeof(uint64_t));
- (void) type;
- char *extra = (char *) tuple_extra(tuple);
- store_u64(extra, column_mask);
-}
-
/**
* Free the tuple of a vinyl space.
* @pre tuple->refs == 0
@@ -710,17 +677,6 @@ const char *
vy_stmt_str(const struct tuple *stmt);
/**
- * Create a tuple format with column mask of an update operation.
- * @sa vy_index.column_mask, vy_can_skip_update().
- * @param mem_format A base tuple format.
- *
- * @retval not NULL Success.
- * @retval NULL Memory or format register error.
- */
-struct tuple_format *
-vy_tuple_format_new_with_colmask(struct tuple_format *mem_format);
-
-/**
* Check if a key of @a tuple contains NULL.
* @param tuple Tuple to check.
* @param def Key def to check by.
diff --git a/test/unit/vy_iterators_helper.c b/test/unit/vy_iterators_helper.c
index 58eaa220..dcd76e4c 100644
--- a/test/unit/vy_iterators_helper.c
+++ b/test/unit/vy_iterators_helper.c
@@ -205,14 +205,8 @@ create_test_mem(struct key_def *def)
0, NULL, 0, NULL);
fail_if(format == NULL);
- /* Create format with column mask */
- struct tuple_format *format_with_colmask =
- vy_tuple_format_new_with_colmask(format);
- assert(format_with_colmask != NULL);
-
/* Create mem */
- struct vy_mem *mem = vy_mem_new(&mem_env, 1, def, format,
- format_with_colmask, 0);
+ struct vy_mem *mem = vy_mem_new(&mem_env, def, format, 1, 0);
fail_if(mem == NULL);
return mem;
}
diff --git a/test/unit/vy_point_lookup.c b/test/unit/vy_point_lookup.c
index 642cb4ce..8cf0fb72 100644
--- a/test/unit/vy_point_lookup.c
+++ b/test/unit/vy_point_lookup.c
@@ -179,9 +179,8 @@ test_basic()
/* create second run */
struct vy_mem *run_mem =
- vy_mem_new(pk->mem->env, *pk->env->p_generation,
- pk->cmp_def, pk->mem_format,
- pk->mem_format_with_colmask, 0);
+ vy_mem_new(pk->mem->env, pk->cmp_def, pk->mem_format,
+ *pk->env->p_generation, 0);
for (size_t i = 0; i < num_of_keys; i++) {
if (!in_run2[i])
@@ -211,10 +210,8 @@ test_basic()
vy_run_unref(run);
/* create first run */
- run_mem =
- vy_mem_new(pk->mem->env, *pk->env->p_generation,
- pk->cmp_def, pk->mem_format,
- pk->mem_format_with_colmask, 0);
+ run_mem = vy_mem_new(pk->mem->env, pk->cmp_def, pk->mem_format,
+ *pk->env->p_generation, 0);
for (size_t i = 0; i < num_of_keys; i++) {
if (!in_run1[i])
--
2.11.0
More information about the Tarantool-patches
mailing list