From: Vladislav Shpilevoy via Tarantool-patches <tarantool-patches@dev.tarantool.org>
To: Serge Petrenko <sergepetrenko@tarantool.org>,
tarantool-patches@dev.tarantool.org
Subject: Re: [Tarantool-patches] [PATCH v2 10/11] box: enrich ER_READONLY with new details
Date: Sat, 13 Nov 2021 00:24:38 +0100 [thread overview]
Message-ID: <225fd821-26be-3afb-3ec5-c0b33487c5a1@tarantool.org> (raw)
In-Reply-To: <ec8e809e-b3d6-87fd-4450-6a3ad6c12006@tarantool.org>
Hi! Thanks for the review!
> 12.11.2021 02:54, Vladislav Shpilevoy пишет:
>> ER_READONLY used not to have any details about the exact reason
>> why the instance is read-only. The patch changes that by adding
>> new fields into the error which explain why the error happened and
>> even help to avoid it for next requests.
>>
>
> Thanks for the changes!
>
> Please, find two comments below.
>
> Sorry for coming up late with this one, but I think it'd be good
> to report ro reason in box.info. Maybe box.info.ro_reason or
> something similar. Only when box.info.ro is true, of course.
>
> Otherwise we help the user only partially. He sees what's wrong when receives
> an error, but has to check every parameter manually when checks box.info.ro
Sounds useful, I added it in a new commit on top of the branch. See a new
email in the same thread.
>> diff --git a/src/box/box.cc b/src/box/box.cc
>> index 1ed1ce3f8..323982969 100644
>> --- a/src/box/box.cc
>> +++ b/src/box/box.cc
>> @@ -177,16 +177,54 @@ box_update_ro_summary(void)
>> static int
>> box_check_writable(void)
>> {
>> - if (is_ro_summary) {
>> + if (!is_ro_summary)
>> + return 0;
>> + struct error *e = diag_set(ClientError, ER_READONLY);
>> + struct raft *raft = box_raft();
>> + /*
>> + * In case of multiple reasons at the same time only one is reported.
>> + * But the order is important. For example, if the instance has election
>> + * enabled, for the client it is better to see that it is a 'follower'
>> + * and who is the leader than just see cfg 'read_only' is true.
>> + */
>> + if (raft_is_ro(raft)) {
>> + error_set_str(e, "reason", "election");
>> + error_set_str(e, "state", raft_state_str(raft->state));
>> + error_set_uint(e, "term", raft->volatile_term);
>> + uint32_t id = raft->leader;
>> + if (id != REPLICA_ID_NIL) {
>> + error_set_uint(e, "leader_id", id);
>> + struct replica *r = replica_by_id(id);
>> + /*
>> + * XXX: when the leader is dropped from _cluster, it
>> + * is not reported to Raft.
>> + */
>> + if (r != NULL)
>> + error_set_uuid(e, "leader_uuid", &r->uuid);
>> + }
>> + } else if (txn_limbo_is_ro(&txn_limbo)) {
>> + error_set_str(e, "reason", "synchro");
>> + uint32_t id = txn_limbo.owner_id;
>> + error_set_uint(e, "queue_owner_id", id);
>> + error_set_uint(e, "term", raft->volatile_term);
>
> I just noticed, we should report txn_limbo_greatest_term here, probably.
>
> This instance (which received ER_READONLY) is the leader, but hasn't claimed
> the limbo yet.
> This only makes sense when limbo term is behind raft's one.
Hmm, you are probably right. Thanks for noticing! Fixed in the
previous commit.
====================
@@ -214,7 +214,7 @@ box_check_writable(void)
} else if (txn_limbo_is_ro(&txn_limbo)) {
error_set_str(e, "reason", "synchro");
uint32_t id = txn_limbo.owner_id;
- uint64_t term = raft->volatile_term;
+ uint64_t term = txn_limbo.promote_greatest_term;
error_set_uint(e, "queue_owner_id", id);
error_set_uint(e, "term", term);
====================
next prev parent reply other threads:[~2021-11-12 23:24 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-11 23:54 [Tarantool-patches] [PATCH v2 00/11] ER_READONLY reason Vladislav Shpilevoy via Tarantool-patches
2021-11-11 23:54 ` [Tarantool-patches] [PATCH v2 01/11] diag: return created error from diag_set() Vladislav Shpilevoy via Tarantool-patches
2021-11-11 23:54 ` [Tarantool-patches] [PATCH v2 10/11] box: enrich ER_READONLY with new details Vladislav Shpilevoy via Tarantool-patches
2021-11-12 7:30 ` Serge Petrenko via Tarantool-patches
2021-11-12 23:24 ` Vladislav Shpilevoy via Tarantool-patches [this message]
2021-11-15 6:51 ` Serge Petrenko via Tarantool-patches
2021-11-15 21:56 ` Vladislav Shpilevoy via Tarantool-patches
2021-11-16 9:53 ` Serge Petrenko via Tarantool-patches
2021-11-16 22:08 ` Vladislav Shpilevoy via Tarantool-patches
2021-11-11 23:54 ` [Tarantool-patches] [PATCH v2 11/11] error: report ER_READONLY reason in message Vladislav Shpilevoy via Tarantool-patches
2021-11-11 23:54 ` [Tarantool-patches] [PATCH v2 02/11] uuid: move into libcore Vladislav Shpilevoy via Tarantool-patches
2021-11-11 23:54 ` [Tarantool-patches] [PATCH v2 03/11] error: introduce error_payload Vladislav Shpilevoy via Tarantool-patches
2021-11-11 23:54 ` [Tarantool-patches] [PATCH v2 04/11] error: move code to struct error from ClientError Vladislav Shpilevoy via Tarantool-patches
2021-11-11 23:54 ` [Tarantool-patches] [PATCH v2 05/11] error: use error_payload to store optional members Vladislav Shpilevoy via Tarantool-patches
2021-11-11 23:54 ` [Tarantool-patches] [PATCH v2 06/11] error: use error_payload in MessagePack codecs Vladislav Shpilevoy via Tarantool-patches
2021-11-11 23:54 ` [Tarantool-patches] [PATCH v2 07/11] error: use error_payload in Lua Vladislav Shpilevoy via Tarantool-patches
2021-11-11 23:54 ` [Tarantool-patches] [PATCH v2 08/11] luatest: copy config in cluster:build_server() Vladislav Shpilevoy via Tarantool-patches
2021-11-11 23:54 ` [Tarantool-patches] [PATCH v2 09/11] luatest: add new helpers for 'server' object Vladislav Shpilevoy via Tarantool-patches
2021-11-12 23:25 ` [Tarantool-patches] [PATCH v2 12/11] error: introduce box.info.ro_reason Vladislav Shpilevoy via Tarantool-patches
2021-11-15 6:53 ` Serge Petrenko via Tarantool-patches
2021-11-16 22:08 ` [Tarantool-patches] [PATCH v2 00/11] ER_READONLY reason Vladislav Shpilevoy via Tarantool-patches
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=225fd821-26be-3afb-3ec5-c0b33487c5a1@tarantool.org \
--to=tarantool-patches@dev.tarantool.org \
--cc=sergepetrenko@tarantool.org \
--cc=v.shpilevoy@tarantool.org \
--subject='Re: [Tarantool-patches] [PATCH v2 10/11] box: enrich ER_READONLY with new details' \
/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