From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: Kirill Yukhin Subject: [PATCH v2 1/4] schema: refactor space_cache API Date: Thu, 25 Oct 2018 11:17:09 +0300 Message-Id: <1e8ea1c80fd917dc78aea785e1d95c76241cf830.1540388902.git.kyukhin@tarantool.org> In-Reply-To: References: In-Reply-To: References: To: vdavydov.dev@gmail.com Cc: tarantool-patches@freelists.org, Kirill Yukhin List-ID: Remove function which deletes from cache, making replace more general: it might be used for both insertions, deletions and replaces. Also, put assert on equality of space pointer found in cache to old one into replace routine. --- src/box/alter.cc | 26 ++++++++++---------------- src/box/schema.cc | 52 +++++++++++++++++++++++++--------------------------- src/box/schema.h | 9 ++------- 3 files changed, 37 insertions(+), 50 deletions(-) diff --git a/src/box/alter.cc b/src/box/alter.cc index de3943c..79ff589 100644 --- a/src/box/alter.cc +++ b/src/box/alter.cc @@ -810,9 +810,7 @@ alter_space_rollback(struct trigger *trigger, void * /* event */) */ space_swap_triggers(alter->new_space, alter->old_space); space_swap_fkeys(alter->new_space, alter->old_space); - struct space *new_space = space_cache_replace(alter->old_space); - assert(new_space == alter->new_space); - (void) new_space; + space_cache_replace(alter->new_space, alter->old_space); alter_space_delete(alter); } @@ -913,9 +911,7 @@ alter_space_do(struct txn *txn, struct alter_space *alter) * The new space is ready. Time to update the space * cache with it. */ - struct space *old_space = space_cache_replace(alter->new_space); - (void) old_space; - assert(old_space == alter->old_space); + space_cache_replace(alter->old_space, alter->new_space); /* * Install transaction commit/rollback triggers to either @@ -1421,7 +1417,7 @@ on_drop_space_rollback(struct trigger *trigger, void *event) { (void) event; struct space *space = (struct space *)trigger->data; - space_cache_replace(space); + space_cache_replace(NULL, space); } /** @@ -1447,9 +1443,7 @@ on_create_space_rollback(struct trigger *trigger, void *event) { (void) event; struct space *space = (struct space *)trigger->data; - struct space *cached = space_cache_delete(space_id(space)); - (void) cached; - assert(cached == space); + space_cache_replace(space, NULL); space_delete(space); } @@ -1610,8 +1604,7 @@ on_drop_view_rollback(struct trigger *trigger, void *event) * * - space cache should be updated, and changes in the space * cache should be reflected in Lua bindings - * (this is done in space_cache_replace() and - * space_cache_delete()) + * (this is done in space_cache_replace()) * * - the space which is changed should be rebuilt according * to the nature of the modification, i.e. indexes added/dropped, @@ -1695,7 +1688,7 @@ on_replace_dd_space(struct trigger * /* trigger */, void *event) * cache right away to achieve linearisable * execution on a replica. */ - (void) space_cache_replace(space); + (void) space_cache_replace(NULL, space); /* * Do not forget to update schema_version right after * inserting the space to the space_cache, since no @@ -1787,7 +1780,7 @@ on_replace_dd_space(struct trigger * /* trigger */, void *event) * cache right away to achieve linearisable * execution on a replica. */ - struct space *space = space_cache_delete(space_id(old_space)); + space_cache_replace(old_space, NULL); /* * Do not forget to update schema_version right after * deleting the space from the space_cache, since no @@ -1795,7 +1788,7 @@ on_replace_dd_space(struct trigger * /* trigger */, void *event) */ ++schema_version; struct trigger *on_commit = - txn_alter_trigger_new(on_drop_space_commit, space); + txn_alter_trigger_new(on_drop_space_commit, old_space); txn_on_commit(txn, on_commit); if (old_space->def->opts.is_view) { struct Select *select = @@ -1817,7 +1810,8 @@ on_replace_dd_space(struct trigger * /* trigger */, void *event) select_guard.is_active = false; } struct trigger *on_rollback = - txn_alter_trigger_new(on_drop_space_rollback, space); + txn_alter_trigger_new(on_drop_space_rollback, + old_space); txn_on_rollback(txn, on_rollback); } else { /* UPDATE, REPLACE */ assert(old_space != NULL && new_tuple != NULL); diff --git a/src/box/schema.cc b/src/box/schema.cc index 2d2be26..08457a46 100644 --- a/src/box/schema.cc +++ b/src/box/schema.cc @@ -158,34 +158,33 @@ space_foreach(int (*func)(struct space *sp, void *udata), void *udata) return 0; } -/** Delete a space from the space cache and Lua. */ -struct space * -space_cache_delete(uint32_t id) -{ - mh_int_t k = mh_i32ptr_find(spaces, id, NULL); - assert(k != mh_end(spaces)); - struct space *space = (struct space *)mh_i32ptr_node(spaces, k)->val; - mh_i32ptr_del(spaces, k, NULL); - space_cache_version++; - return space; -} - /** - * Update the space in the space cache and in Lua. Returns - * the old space instance, if any, or NULL if it's a new space. + * Update the space in the space cache and in Lua. */ -struct space * -space_cache_replace(struct space *space) +void +space_cache_replace(struct space *old_space, struct space *new_space) { - const struct mh_i32ptr_node_t node = { space_id(space), space }; - struct mh_i32ptr_node_t old, *p_old = &old; - mh_int_t k = mh_i32ptr_put(spaces, &node, &p_old, NULL); - if (k == mh_end(spaces)) { - panic_syserror("Out of memory for the data " - "dictionary cache."); + assert(new_space != NULL || old_space != NULL); + if (new_space != NULL) { + const struct mh_i32ptr_node_t node_p = { space_id(new_space), + new_space }; + struct mh_i32ptr_node_t old, *p_old = &old; + mh_int_t k = mh_i32ptr_put(spaces, &node_p, &p_old, NULL); + if (k == mh_end(spaces)) { + panic_syserror("Out of memory for the data " + "dictionary cache."); + } + assert((struct space *)p_old->val == old_space); + } else { + mh_int_t k = mh_i32ptr_find(spaces, space_id(old_space), NULL); + assert(k != mh_end(spaces)); + struct space *old_space_by_id = + (struct space *)mh_i32ptr_node(spaces, k)->val; + (void)old_space_by_id; + assert(old_space_by_id == old_space); + mh_i32ptr_del(spaces, k, NULL); } space_cache_version++; - return p_old ? (struct space *) p_old->val : NULL; } /** A wrapper around space_new() for data dictionary spaces. */ @@ -220,7 +219,7 @@ sc_space_new(uint32_t id, const char *name, rlist_create(&key_list); rlist_add_entry(&key_list, index_def, link); struct space *space = space_new_xc(def, &key_list); - (void) space_cache_replace(space); + (void) space_cache_replace(NULL, space); if (replace_trigger) trigger_add(&space->on_replace, replace_trigger); if (stmt_begin_trigger) @@ -431,7 +430,7 @@ schema_init() }); RLIST_HEAD(key_list); struct space *space = space_new_xc(def, &key_list); - space_cache_replace(space); + space_cache_replace(NULL, space); init_system_space(space); trigger_run_xc(&on_alter_space, space); } @@ -447,8 +446,7 @@ schema_free(void) struct space *space = (struct space *) mh_i32ptr_node(spaces, i)->val; - space_cache_delete(space_id(space)); - space_delete(space); + space_cache_replace(space, NULL); } mh_i32ptr_delete(spaces); while (mh_size(funcs) > 0) { diff --git a/src/box/schema.h b/src/box/schema.h index 264c16b..05f32de 100644 --- a/src/box/schema.h +++ b/src/box/schema.h @@ -134,14 +134,9 @@ space_cache_find_xc(uint32_t id) /** * Update contents of the space cache. Typically the new space is * an altered version of the original space. - * Returns the old space, if any. */ -struct space * -space_cache_replace(struct space *space); - -/** Delete a space from the space cache. */ -struct space * -space_cache_delete(uint32_t id); +void +space_cache_replace(struct space *old_space, struct space *new_space); void schema_init(); -- 2.11.0