From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtpng2.m.smailru.net (smtpng2.m.smailru.net [94.100.179.3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id 6E92E469710 for ; Mon, 23 Nov 2020 16:40:34 +0300 (MSK) Date: Mon, 23 Nov 2020 16:40:30 +0300 From: Igor Munkin Message-ID: <20201123134030.GB14086@tarantool.org> References: <8f87d28e7b1dc259fa0b1f230c0c6a5b25573bf1.1605912044.git.v.shpilevoy@tarantool.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <8f87d28e7b1dc259fa0b1f230c0c6a5b25573bf1.1605912044.git.v.shpilevoy@tarantool.org> Subject: Re: [Tarantool-patches] [PATCH 1/1] swim: don't call swim_quit via FFI List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Vladislav Shpilevoy Cc: tarantool-patches@dev.tarantool.org 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 equals to would be nice here. Feel free to ignore. > + swim_quit(s); > + return 0; > +} > + > void > tarantool_lua_swim_init(struct lua_State *L) > { > -- > 2.24.3 (Apple Git-128) > -- Best regards, IM