Tarantool development patches archive
 help / color / mirror / Atom feed
From: Vladislav Shpilevoy <v.shpilevoy@tarantool.org>
To: Nikita Pettik <korablev@tarantool.org>
Cc: tarantool-patches@dev.tarantool.org
Subject: Re: [Tarantool-patches] [PATCH v2 10/10] iproto: support error stacked diagnostic area
Date: Sat, 4 Apr 2020 01:17:52 +0200	[thread overview]
Message-ID: <2cf09865-aec8-8c35-489a-25b05734fbaa@tarantool.org> (raw)
In-Reply-To: <20200403021647.GD946@tarantool.org>

Thanks for the fixes!

See 3 comments below.

>     iproto: support error stacked diagnostic area
>     
>     This patch introduces support of stacked errors in IProto protocol and
>     in net.box module.
>     
>     Closes #1148
>     ```
>     MAP{IPROTO_ERROR : string, IPROTO_ERROR_STACK : ARRAY[MAP{ERROR_CODE : uint, ERROR_MESSAGE : string}, MAP{...}, ...]}
>     ```
>     where IPROTO_ERROR is 0x31 key, IPROTO_ERROR_STACK is 0x51, ERROR_CODE

1. IPROTO_ERROR_STACK is actually 0x52.

>     is 0x01 and ERROR_MESSAGE is 0x02.
On 03/04/2020 04:16, Nikita Pettik wrote:
> On 03 Apr 00:20, Vladislav Shpilevoy wrote:
>> Thanks for the fixes!
>>
>> See 2 comments below.
>>
>>> diff --git a/src/box/error.cc b/src/box/error.cc
>>> index 8e77c2e9e..897aa9261 100644
>>> --- a/src/box/error.cc
>>> +++ b/src/box/error.cc
>>> @@ -102,6 +102,23 @@ box_error_new(const char *file, unsigned line, uint32_t code,
>>>  	return e;
>>>  }
>>>  
>>> +int
>>> +box_error_add(const char *file, unsigned line, uint32_t code,
>>> +	      const char *fmt, ...)
>>> +{
>>> +	struct error *e = BuildClientError(file, line, ER_UNKNOWN);
>>> +	ClientError *client_error = type_cast(ClientError, e);
>>> +	if (client_error) {
>>> +		client_error->m_errcode = code;
>>> +		va_list ap;
>>> +		va_start(ap, fmt);
>>> +		error_vformat_msg(e, fmt, ap);
>>> +		va_end(ap);
>>> +	}
>>> +	diag_add_error(&fiber()->diag, e);
>>> +	return -1;
>>
>> 1. Why do we return -1 instead of the new error object?
>> box_error_new() returns an error, and this function does not.
>> Seems inconsistent.
> 
> box_error_new() is supposed to return new error according to
> its name (to be more precise - '_new' suffix). It allocates and
> fills in error struct. On the other hand, box_error_add() creates
> error and adds it to the diagnostic area. It is simply meaningless
> to return error, which is already set to diag.

2. Yeah, sorry. I mistakenly took box_error_new() for box_error_set().
You are right.

>> diff --git a/test/unit/xrow.cc b/test/unit/xrow.cc
>> index ae45f18b0..718ef15a2 100644
>> --- a/test/unit/xrow.cc
>> +++ b/test/unit/xrow.cc
>> @@ -392,9 +393,51 @@ test_xrow_error_stack_decode()
>> +	/* Overflow error code. */
>> +	pos = mp_encode_map(buffer, 1);
>> +	pos = mp_encode_uint(pos, IPROTO_ERROR_STACK);
>> +	pos = mp_encode_array(pos, 1);
>> +	pos = mp_encode_map(pos, 2);
>> +	pos = mp_encode_uint(pos, IPROTO_ERROR_CODE);
>> +	pos = mp_encode_uint(pos, (uint64_t)1 << 40);
>> +	pos = mp_encode_uint(pos, IPROTO_ERROR_MESSAGE);
>> +	pos = mp_encode_str(pos, "test msg", strlen("test msg"));
>> +	header.body[0].iov_base = buffer;
>> +	header.body[0].iov_len = pos - buffer;
>> +
>> +	diag_clear(diag_get());
>> +	xrow_decode_error(&header);
>> +	last = diag_last_error(diag_get());
>> +	isnt(last, NULL, "xrow_decode succeed: diag has been set");
>> +	is(box_error_code(last), 159, "xrow_decode failed, took code from "
>> +	   "header");
>> +	is(strcmp(last->errmsg, ""), 0, "xrow_decode failed, message is not "
>> +	   "decoded");
>> +
>> +	/* Overflow error key. */
>> +	pos = mp_encode_map(buffer, 1);
>> +	pos = mp_encode_uint(pos, IPROTO_ERROR_STACK);
>> +	pos = mp_encode_array(pos, 1);
>> +	pos = mp_encode_map(pos, 2);
>> +	pos = mp_encode_uint(pos, 0xff00000000 | IPROTO_ERROR_CODE);
>> +	pos = mp_encode_uint(pos, 159);
>> +	pos = mp_encode_uint(pos, IPROTO_ERROR_MESSAGE);
>> +	pos = mp_encode_str(pos, "test msg", strlen("test msg"));
>> +	header.body[0].iov_base = buffer;
>> +	header.body[0].iov_len = pos - buffer;
>> +
>> +	diag_clear(diag_get());
>> +	xrow_decode_error(&header);
>> +	last = diag_last_error(diag_get());
>> +	isnt(last, NULL, "xrow_decode succeed: diag has been set");
>> +	is(box_error_code(last), 0, "xrow_decode last error code is default 0");
>> +	is(strcmp(last->errmsg, "test msg"), 0, "xrow_decode message is fine "
>> +	   "even without the code");
> 
> It is likely to be the same as "Bad key in the packet.". At least it
> seems to cover the same execution path.

3. You can merge them if you want. But then you need to use
0xff00000000, not 0xff000000. To ensure, that it is truncated
to 0 if cast to uint32.

The patchset LGTM, including the box.error() path to set diag
with a struct error object. Except the wrong IPROTO_ERROR_STACK
code in the commit message. Please, fix it, and send the patchset
to a second reviewer, keeping me in copy just in case.

  reply	other threads:[~2020-04-03 23:17 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-25  1:42 [Tarantool-patches] [PATCH v2 00/10] Stacked diagnostics Nikita Pettik
2020-03-25  1:42 ` [Tarantool-patches] [PATCH v2 01/10] box: rfc for stacked diagnostic area Nikita Pettik
2020-03-25  8:27   ` Konstantin Osipov
2020-03-25 14:08     ` Nikita Pettik
2020-03-25  1:42 ` [Tarantool-patches] [PATCH v2 02/10] box: rename diag_add_error to diag_set_error Nikita Pettik
2020-03-25  8:27   ` Konstantin Osipov
2020-03-26  0:22   ` Vladislav Shpilevoy
2020-03-26 12:31     ` Nikita Pettik
2020-03-25  1:42 ` [Tarantool-patches] [PATCH v2 03/10] test: move box.error tests to box/error.test.lua Nikita Pettik
2020-03-25  8:28   ` Konstantin Osipov
2020-03-26  0:22   ` Vladislav Shpilevoy
2020-03-26 12:31     ` Nikita Pettik
2020-03-25  1:43 ` [Tarantool-patches] [PATCH v2 04/10] box/error: introduce box.error.set() method Nikita Pettik
2020-03-25  8:33   ` Konstantin Osipov
2020-03-25 17:41     ` Nikita Pettik
2020-03-26  0:22   ` Vladislav Shpilevoy
2020-03-26 12:31     ` Nikita Pettik
2020-03-25  1:43 ` [Tarantool-patches] [PATCH v2 05/10] box/error: don't set error created via box.error.new to diag Nikita Pettik
2020-03-26 16:50   ` Konstantin Osipov
2020-03-26 17:59     ` Nikita Pettik
2020-03-26 18:06       ` Nikita Pettik
2020-03-26 18:07       ` Alexander Turenko
2020-03-27  0:19   ` Vladislav Shpilevoy
2020-03-27 13:09     ` Nikita Pettik
2020-03-25  1:43 ` [Tarantool-patches] [PATCH v2 06/10] box: introduce stacked diagnostic area Nikita Pettik
2020-03-26 16:54   ` Konstantin Osipov
2020-03-26 18:03     ` Nikita Pettik
2020-03-26 18:08       ` Konstantin Osipov
2020-03-28 18:40   ` Vladislav Shpilevoy
2020-04-01 16:09     ` Nikita Pettik
2020-04-02  0:29       ` Vladislav Shpilevoy
2020-04-02 17:42         ` Nikita Pettik
2020-04-02 22:20           ` Vladislav Shpilevoy
2020-04-03  1:54             ` Nikita Pettik
2020-04-03 23:17               ` Vladislav Shpilevoy
2020-03-28 18:59   ` Vladislav Shpilevoy
2020-03-31 17:44     ` Nikita Pettik
2020-04-02  0:29       ` Vladislav Shpilevoy
2020-04-02 14:16         ` Nikita Pettik
2020-03-25  1:43 ` [Tarantool-patches] [PATCH v2 07/10] box: use stacked diagnostic area for functional indexes Nikita Pettik
2020-03-30 23:24   ` Vladislav Shpilevoy
2020-04-01 15:53     ` Nikita Pettik
2020-03-25  1:43 ` [Tarantool-patches] [PATCH v2 08/10] box/error: clarify purpose of reference counting in struct error Nikita Pettik
2020-03-30 23:24   ` Vladislav Shpilevoy
2020-03-25  1:43 ` [Tarantool-patches] [PATCH v2 09/10] iproto: refactor error encoding with mpstream Nikita Pettik
2020-03-30 23:24   ` Vladislav Shpilevoy
2020-04-01 15:54     ` Nikita Pettik
2020-03-25  1:43 ` [Tarantool-patches] [PATCH v2 10/10] iproto: support error stacked diagnostic area Nikita Pettik
2020-03-30 23:24   ` Vladislav Shpilevoy
2020-04-01 16:26     ` Nikita Pettik
2020-04-01 22:24       ` Nikita Pettik
2020-04-02  0:29         ` Vladislav Shpilevoy
2020-04-02 14:01           ` Nikita Pettik
2020-04-02 22:20             ` Vladislav Shpilevoy
2020-04-03  2:16               ` Nikita Pettik
2020-04-03 23:17                 ` Vladislav Shpilevoy [this message]
2020-04-06 11:07                   ` Nikita Pettik

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=2cf09865-aec8-8c35-489a-25b05734fbaa@tarantool.org \
    --to=v.shpilevoy@tarantool.org \
    --cc=korablev@tarantool.org \
    --cc=tarantool-patches@dev.tarantool.org \
    --subject='Re: [Tarantool-patches] [PATCH v2 10/10] iproto: support error stacked diagnostic area' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox