From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lj1-f195.google.com (mail-lj1-f195.google.com [209.85.208.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id 6FA5A46970E for ; Mon, 13 Jan 2020 15:15:05 +0300 (MSK) Received: by mail-lj1-f195.google.com with SMTP id w1so9774680ljh.5 for ; Mon, 13 Jan 2020 04:15:05 -0800 (PST) From: HustonMmmavr Date: Mon, 13 Jan 2020 15:14:49 +0300 Message-Id: <20200113121449.36540-1-huston.mavr@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [Tarantool-patches] [PATCH v2] fio: fix race condition in mktree List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: tarantool-patches@dev.tarantool.org, imun@tarantool.org Despite the lack of documentation, fio.mktree() was designed to work similar to mkdir -p: it creates the directory along with it's parents and doesn't complain about existing ones. But this function was subject to a race if two different processes were trying to create the same directory at the same time. It was caused by the fact that directory existence check and its creation aren't atomic. This patch fixes the race by impoving error handling: it's not an error if directory exists, even if it was created by someone else and mktree failed. Related to https://github.com/tarantool/doc/issues/1063 Closes #4660 --- branch: https://github.com/tarantool/tarantool/tree/HustonMmmavr/gh-4660-fix-fio-mktree-race src/lua/fio.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lua/fio.lua b/src/lua/fio.lua index cb224f3d0..c9aeac951 100644 --- a/src/lua/fio.lua +++ b/src/lua/fio.lua @@ -364,7 +364,7 @@ fio.mktree = function(path, mode) local stat = fio.stat(current_dir) if stat == nil then local st, err = fio.mkdir(current_dir, mode) - if err ~= nil then + if err ~= nil and not fio.path.is_dir(current_dir) then return false, string.format("Error creating directory %s: %s", current_dir, tostring(err)) end -- 2.23.0