[Tarantool-patches] [PATCH 1/1] swim: don't call swim_quit via FFI
Igor Munkin
imun at tarantool.org
Mon Nov 23 16:40:30 MSK 2020
Vlad,
Thanks for the patch! LGTM, with a couple nits below.
On 20.11.20, Vladislav Shpilevoy wrote:
> swim_quit yields, because it joins the event handler fiber. Hence
> it can't be called via FFI, where a yield leads to undefined
> behaviour.
Minor: I wouldn't call this UB, let's reword it "where a yield might
lead to the platform panic".
>
> Closes #4570
> ---
> Branch: http://github.com/tarantool/tarantool/tree/gerold103/gh-4570-swim-crash
> Issue: https://github.com/tarantool/tarantool/issues/4570
>
> @ChangeLog
> * Fixed a crash in swim.quit() (gh-4570).
>
> src/lua/swim.c | 14 ++++++++++++++
> src/lua/swim.lua | 5 +----
> 2 files changed, 15 insertions(+), 4 deletions(-)
>
> diff --git a/src/lua/swim.c b/src/lua/swim.c
> index ae916bf78..b9c9dd635 100644
> --- a/src/lua/swim.c
> +++ b/src/lua/swim.c
> @@ -88,6 +88,19 @@ lua_swim_delete(struct lua_State *L)
> return 0;
> }
>
> +/**
> + * Gracefully leave the cluster, broadcast a notification, and delete the SWIM
> + * instance. It is not FFI, because this operation yields.
> + */
> +static int
> +lua_swim_quit(struct lua_State *L)
> +{
> + uint32_t ctypeid;
> + struct swim *s = *(struct swim **) luaL_checkcdata(L, 1, &ctypeid);
Minor: I don't know whether it's common practice in Tarantool, but
assert that <ctypeid> equals to <ctid_swim_ptr> would be nice here.
Feel free to ignore.
> + swim_quit(s);
> + return 0;
> +}
> +
> void
> tarantool_lua_swim_init(struct lua_State *L)
> {
<snipped>
> --
> 2.24.3 (Apple Git-128)
>
--
Best regards,
IM
More information about the Tarantool-patches
mailing list