Tarantool development patches archive
 help / color / mirror / Atom feed
From: Konstantin Osipov <kostja@tarantool.org>
To: Kirill Shcherbatov <kshcherbatov@tarantool.org>
Cc: tarantool-patches@freelists.org, georgy@tarantool.org,
	alexander.turenko@tarantool.org
Subject: [tarantool-patches] Re: [PATCH v2 3/3] box: introduce stacked diagnostic area
Date: Tue, 27 Aug 2019 01:34:23 +0300	[thread overview]
Message-ID: <20190826223423.GC1189@atlas> (raw)
In-Reply-To: <c6ccd89679975f57a0f3f7bdded2f091f21e495e.1566553968.git.kshcherbatov@tarantool.org>

* Kirill Shcherbatov <kshcherbatov@tarantool.org> [19/08/23 13:03]:
>  static inline void
> @@ -90,9 +92,11 @@ static inline void
>  error_unref(struct error *e)
>  {
>  	assert(e->refs > 0);
> -	--e->refs;
> -	if (e->refs == 0)
> +	if (--e->refs == 0) {
> +		if (e->reason != NULL)
> +			error_unref(e->reason);
>  		e->destroy(e);
> +	}

This looks fragile, can you rewrite this place without recursion?
> + * Remove all errors set in a given diagnostics area after a
> + * given savepoint.
> + *
> + * Operation removes reason for the error
> + * preceding the savepoint and releases a diagnostic area's
> + * reference on the most recent error (diag::last for the
> + * rollback beginning). This means that if user code have a
> + * pointer and have a reference to an error object from the
> + * rollback zone, this pointer and the following "reason" error
> + * objects are a valid error list.
> + */

BTW, did you check if anyone likes the name 'reason'? I'm not very
fond of it, previous error is not always the reason of the current
one. I would simply call it 'prev' or 'next'.

> +	if (diag->last != begin) {
> +		assert(prev != NULL && prev->reason == svp);
> +		prev->reason = NULL;
> +		error_unref(begin);

OK, this works because you terminate the list with NULL first...

> +		prev->reason = svp;
> +		error_ref(svp);
> +	}
> +}
> +
> +++ b/src/box/key_list.c
> @@ -63,9 +63,9 @@ key_list_iterator_create(struct key_list_iterator *it, struct tuple *tuple,
>  	if (rc != 0) {
>  		/* Can't evaluate function. */
>  		struct space *space = space_by_id(index_def->space_id);
> -		diag_set(ClientError, ER_FUNC_INDEX_FUNC, index_def->name,
> -			 space ? space_name(space) : "",
> -			 diag_last_error(diag_get())->errmsg);
> +		diag_add(ClientError, ER_FUNC_INDEX_FUNC, index_def->name,
> +			 space != NULL ? space_name(space) : "",
> +			 "can't evaluate function");
>  		return -1;
>  	}
>  	uint32_t key_data_sz;
> @@ -74,9 +74,9 @@ key_list_iterator_create(struct key_list_iterator *it, struct tuple *tuple,
>  	if (key_data == NULL) {
>  		struct space *space = space_by_id(index_def->space_id);
>  		/* Can't get a result returned by function . */
> -		diag_set(ClientError, ER_FUNC_INDEX_FUNC, index_def->name,
> -			 space ? space_name(space) : "",
> -			 diag_last_error(diag_get())->errmsg);
> +		diag_add(ClientError, ER_FUNC_INDEX_FUNC, index_def->name,
> +			 space != NULL ? space_name(space) : "",
> +			 "can't get a value returned by function");
>  		return -1;
>  	}

Nice. I bet there is a bunch of places like that, forgotten by
now.
With these two comments, LGTM.

-- 
Konstantin Osipov, Moscow, Russia

  reply	other threads:[~2019-08-26 22:34 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-08-23  9:59 [tarantool-patches] [PATCH v2 0/3] box: stacked diagnostics area in fiber Kirill Shcherbatov
2019-08-23  9:59 ` [tarantool-patches] [PATCH v2 1/3] box: rfc for stacked diagnostic area in Tarantool Kirill Shcherbatov
2019-08-26 22:26   ` [tarantool-patches] " Konstantin Osipov
2019-08-26 23:25     ` Alexander Turenko
2019-08-27 18:38       ` Konstantin Osipov
2019-08-30 12:58   ` Alexander Turenko
2019-08-30 13:24     ` Kirill Shcherbatov
2019-08-30 14:11       ` Alexander Turenko
2019-08-30 14:13         ` Kirill Shcherbatov
2019-08-30 14:19           ` Alexander Turenko
2019-08-23  9:59 ` [tarantool-patches] [PATCH v2 2/3] box: rename diag_add_error to diag_set_error Kirill Shcherbatov
2019-08-26 22:27   ` [tarantool-patches] " Konstantin Osipov
2019-08-23  9:59 ` [tarantool-patches] [PATCH v2 3/3] box: introduce stacked diagnostic area Kirill Shcherbatov
2019-08-26 22:34   ` Konstantin Osipov [this message]
2019-08-26 23:23     ` [tarantool-patches] " Alexander Turenko
2019-08-28  9:26       ` Konstantin Osipov
2019-08-26 22:34   ` Konstantin Osipov

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=20190826223423.GC1189@atlas \
    --to=kostja@tarantool.org \
    --cc=alexander.turenko@tarantool.org \
    --cc=georgy@tarantool.org \
    --cc=kshcherbatov@tarantool.org \
    --cc=tarantool-patches@freelists.org \
    --subject='[tarantool-patches] Re: [PATCH v2 3/3] box: introduce 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