From: Cyrill Gorcunov via Tarantool-patches <tarantool-patches@dev.tarantool.org> To: tml <tarantool-patches@dev.tarantool.org> Cc: Vladislav Shpilevoy <v.shpilevoy@tarantool.org> Subject: Re: [Tarantool-patches] [PATCH v12 4/8] module_cache: direct update a cache value on reload Date: Tue, 19 Jan 2021 15:46:49 +0300 [thread overview] Message-ID: <20210119124649.GA2185@grain> (raw) In-Reply-To: <20210118203556.281700-5-gorcunov@gmail.com> On Mon, Jan 18, 2021 at 11:35:52PM +0300, Cyrill Gorcunov wrote: > Currently when we reload modules we remove old instance > from the module cache and then try to insert a new one > back. Note that module cache is a string based hash table: > we lookup for a pointer to the module via package name. This approach doesn't work. An update patch attached. I force pushed the update. --- From: Cyrill Gorcunov <gorcunov@gmail.com> Date: Tue, 12 Jan 2021 11:53:50 +0300 Subject: [PATCH v12 4/8] module_cache: panic if module cache update failed Currently when we reload modules we remove old instance from the module cache and then try to insert a new one back. If error happens inbetween (say machine reached lack of memory and hash resize failed) we try to restore functions on old module. This is fine but we can't continue working with modules -- next reload action won't find the module in hash and won't reload. Since this is a really rare case plain panic should be fine here. Part-of #4642 Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com> --- src/box/module_cache.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/box/module_cache.c b/src/box/module_cache.c index 8ae61a883..ccf079d7a 100644 --- a/src/box/module_cache.c +++ b/src/box/module_cache.c @@ -422,6 +422,24 @@ module_sym_call(struct module_sym *mod_sym, struct port *args, return rc; } +/** + * Update the module cache. + */ +static void +module_cache_update(const char *package, const char *package_end, + struct module *module) +{ + /* + * Due to hash internals we need to remove old node + * and insert a new one. If there some memory pressure + * happen between these actions we would loose the hash + * node and this make inconsistent the next modules reload. + */ + module_cache_del(package, package_end); + if (module_cache_add(module) != 0) + panic("module: can't update module cache (%s)", package); +} + int module_reload(const char *package, const char *package_end, struct module **module) @@ -453,10 +471,7 @@ module_reload(const char *package, const char *package_end, rlist_move(&new->funcs_list, &mod_sym->item); } - module_cache_del(package, package_end); - if (module_cache_add(new) != 0) - goto restore; - + module_cache_update(package, package_end, new); module_gc(old); *module = new; return 0; -- 2.29.2
next prev parent reply other threads:[~2021-01-19 12:46 UTC|newest] Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-01-18 20:35 [Tarantool-patches] [PATCH v12 0/8] box: implement cmod Lua module Cyrill Gorcunov via Tarantool-patches 2021-01-18 20:35 ` [Tarantool-patches] [PATCH v12 1/8] box/func: factor out c function entry structure Cyrill Gorcunov via Tarantool-patches 2021-01-18 20:35 ` [Tarantool-patches] [PATCH v12 2/8] module_cache: move module handling into own subsystem Cyrill Gorcunov via Tarantool-patches 2021-01-24 16:26 ` Vladislav Shpilevoy via Tarantool-patches 2021-01-25 8:52 ` Cyrill Gorcunov via Tarantool-patches 2021-01-18 20:35 ` [Tarantool-patches] [PATCH v12 3/8] module_cache: improve naming Cyrill Gorcunov via Tarantool-patches 2021-01-24 16:27 ` Vladislav Shpilevoy via Tarantool-patches 2021-01-24 22:32 ` Cyrill Gorcunov via Tarantool-patches 2021-01-30 18:53 ` Vladislav Shpilevoy via Tarantool-patches 2021-02-01 11:41 ` Cyrill Gorcunov via Tarantool-patches 2021-01-18 20:35 ` [Tarantool-patches] [PATCH v12 4/8] module_cache: direct update a cache value on reload Cyrill Gorcunov via Tarantool-patches 2021-01-19 12:46 ` Cyrill Gorcunov via Tarantool-patches [this message] 2021-01-24 16:27 ` Vladislav Shpilevoy via Tarantool-patches 2021-01-24 22:26 ` Cyrill Gorcunov via Tarantool-patches 2021-01-18 20:35 ` [Tarantool-patches] [PATCH v12 5/8] module_cache: rename calls to ref in module structure Cyrill Gorcunov via Tarantool-patches 2021-01-24 16:27 ` Vladislav Shpilevoy via Tarantool-patches 2021-01-25 10:29 ` Cyrill Gorcunov via Tarantool-patches 2021-01-18 20:35 ` [Tarantool-patches] [PATCH v12 6/8] module_cache: provide helpers to load and unload modules Cyrill Gorcunov via Tarantool-patches 2021-01-24 16:28 ` Vladislav Shpilevoy via Tarantool-patches 2021-01-18 20:35 ` [Tarantool-patches] [PATCH v12 7/8] box/cmod: implement cmod Lua module Cyrill Gorcunov via Tarantool-patches 2021-01-24 16:28 ` Vladislav Shpilevoy via Tarantool-patches 2021-01-25 16:50 ` Cyrill Gorcunov via Tarantool-patches 2021-01-30 18:53 ` Vladislav Shpilevoy via Tarantool-patches 2021-01-18 20:35 ` [Tarantool-patches] [PATCH v12 8/8] test: box/cfunc -- add cmod test Cyrill Gorcunov via Tarantool-patches 2021-01-24 16:28 ` Vladislav Shpilevoy via Tarantool-patches 2021-01-24 16:26 ` [Tarantool-patches] [PATCH v12 0/8] box: implement cmod Lua module Vladislav Shpilevoy via Tarantool-patches
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20210119124649.GA2185@grain \ --to=tarantool-patches@dev.tarantool.org \ --cc=gorcunov@gmail.com \ --cc=v.shpilevoy@tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH v12 4/8] module_cache: direct update a cache value on reload' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox