From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp44.i.mail.ru (smtp44.i.mail.ru [94.100.177.104]) (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 086C2446429 for ; Sat, 21 Mar 2020 00:28:02 +0300 (MSK) References: <20200319145310.GK6392@tarantool.org> <20200319225339.GO6392@tarantool.org> <20200320104823.GQ6392@tarantool.org> From: Vladislav Shpilevoy Message-ID: <19736aa3-aa20-e56a-8ea5-4a40f6c4c8e4@tarantool.org> Date: Fri, 20 Mar 2020 22:28:00 +0100 MIME-Version: 1.0 In-Reply-To: <20200320104823.GQ6392@tarantool.org> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Subject: Re: [Tarantool-patches] [PATCH v2 2/3] fio: close unused descriptors automatically List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Igor Munkin Cc: tarantool-patches@dev.tarantool.org >> diff --git a/src/lua/fio.lua b/src/lua/fio.lua >> index 4692e1026..d3c257b88 100644 >> --- a/src/lua/fio.lua >> +++ b/src/lua/fio.lua > > > >> @@ -160,7 +165,22 @@ fio_methods.stat = function(self) >> return internal.fstat(self.fh) >> end >> >> -local fio_mt = { __index = fio_methods } >> +fio_methods.__serialize = function(self) >> + return {fh = self.fh} >> +end >> + >> +local fio_mt = { >> + __index = fio_methods, >> + __gc = function(obj) >> + if obj.fh >= 0 then > > Considering the current semantics of fio_methods.close (I added the code > below) if internal.close fails, retry is not triggered in __gc mm due to > the condition above. I guess you just missed to fix it here (you hoisted > the error handling in the previous patch). Yeah, I knew :) I just didn't want to touch this place. But ok, here is a separate commit to fix this thing, since it existed before my patch, and is an independent bug. ==================== commit 1dcd0e6ffb1916d38b374f6df634dfcf3c0a40bc Author: Vladislav Shpilevoy Date: Fri Mar 20 22:20:20 2020 +0100 fio: on close() don't loose fd if internal close fails File descriptor was set to -1 regardless of whether the object was closed properly. As a result, in case of an error the descriptor would leak. GC finalizer of a descriptor is left intact not to overcomplicate it. diff --git a/src/lua/fio.lua b/src/lua/fio.lua index d3c257b88..83fddaa0a 100644 --- a/src/lua/fio.lua +++ b/src/lua/fio.lua @@ -146,10 +146,10 @@ end fio_methods.close = function(self) local res, err = internal.close(self.fh) - self.fh = -1 if err ~= nil then return false, err end + self.fh = -1 return res end