[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