From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp41.i.mail.ru (smtp41.i.mail.ru [94.100.177.101]) (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 8583C4696C7 for ; Mon, 6 Apr 2020 17:17:20 +0300 (MSK) From: Nikita Pettik Date: Mon, 6 Apr 2020 17:17:14 +0300 Message-Id: <67e17e1bfa4f8ae989aa176b50b57b155a667935.1586181413.git.korablev@tarantool.org> In-Reply-To: References: In-Reply-To: References: Subject: [Tarantool-patches] [PATCH v3 5/6] box: always promote error created via box.error() to diag List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: tarantool-patches@dev.tarantool.org Cc: v.shpilevoy@tarantool.org This patch makes box.error() always promote error to the diagnostic area despite of passed arguments. Closes #4829 @TarantoolBot document Title: always promote error created via box.error() to diag box.error() is able to accept two types of argument: either pair of code and reason (box.error{code = 555, reason = 'Arbitrary message'}) or error object (box.error(err)). In the first case error is promoted to diagnostic area, meanwhile in the latter - it is not: ``` e1 = box.error.new({code = 111, reason = "cause"}) box.error({code = 111, reason = "err"}) - error: err box.error.last() - err box.error(e1) - error: cause box.error.last() - err ``` >From now box.error(e1) sets error to diagnostic area as well: ``` box.error(e1) - error: cause box.error.last() - cause ``` --- src/box/lua/error.cc | 13 ++++++++++--- test/box/error.result | 22 ++++++++++++++++++++++ test/box/error.test.lua | 8 ++++++++ 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/box/lua/error.cc b/src/box/lua/error.cc index 08c2d983d..b2625bf5f 100644 --- a/src/box/lua/error.cc +++ b/src/box/lua/error.cc @@ -114,9 +114,16 @@ luaT_error_call(lua_State *L) return luaT_error(L); return 0; } - if (lua_gettop(L) == 2 && luaL_iserror(L, 2)) - return lua_error(L); - struct error *e = luaT_error_create(L, 2); + struct error *e = NULL; + if (lua_gettop(L) == 2) { + e = luaL_iserror(L, 2); + if (e != NULL) { + /* Re-set error to diag area. */ + diag_set_error(&fiber()->diag, e); + return lua_error(L); + } + } + e = luaT_error_create(L, 2); if (e == NULL) return luaL_error(L, "box.error(): bad arguments"); diag_set_error(&fiber()->diag, e); diff --git a/test/box/error.result b/test/box/error.result index 3d07f6e64..234c26371 100644 --- a/test/box/error.result +++ b/test/box/error.result @@ -808,3 +808,25 @@ assert(e2.prev == e3) | --- | - true | ... + +-- gh-4829: always promote error created via box.error() to +-- diagnostic area. +e1 = box.error.new({code = 111, reason = "cause"}) + | --- + | ... +box.error({code = 111, reason = "err"}) + | --- + | - error: err + | ... +box.error.last() + | --- + | - err + | ... +box.error(e1) + | --- + | - error: cause + | ... +assert(box.error.last() == e1) + | --- + | - true + | ... diff --git a/test/box/error.test.lua b/test/box/error.test.lua index ed7eb7565..41baed52d 100644 --- a/test/box/error.test.lua +++ b/test/box/error.test.lua @@ -221,3 +221,11 @@ e2:set_prev(e3) box.error.set(e2) assert(e1.prev == nil) assert(e2.prev == e3) + +-- gh-4829: always promote error created via box.error() to +-- diagnostic area. +e1 = box.error.new({code = 111, reason = "cause"}) +box.error({code = 111, reason = "err"}) +box.error.last() +box.error(e1) +assert(box.error.last() == e1) -- 2.17.1