From: Vladislav Shpilevoy <v.shpilevoy@tarantool.org> To: tarantool-patches@dev.tarantool.org, sergepetrenko@tarantool.org Subject: [Tarantool-patches] [PATCH v2 10/16] raft: make worker non-cancellable during WAL write Date: Fri, 20 Nov 2020 00:45:58 +0100 [thread overview] Message-ID: <268bcf29eb045de623c18c58942c07b2491658f0.1605829282.git.v.shpilevoy@tarantool.org> (raw) In-Reply-To: <cover.1605829282.git.v.shpilevoy@tarantool.org> This is a general practice throughout the code. If a fiber is not cancellable, it always means a system fiber which can't be woken up or canceled until its work done. It is used in gc (about xlogs), recovery, vinyl, WAL, at least. Before raft used flag raft.is_write_in_progress. But it won't work soon, because the worker fiber will move to box/raft.c, where it would be incorrect to rely on deeply internal parts of struct raft, such as is_write_in_progress. Hence, this patch makes raft use a more traditional way of spurious wakeup avoidance. Part of #5303 --- src/box/raft.c | 9 ++++++++- src/box/raftlib.c | 10 ++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/box/raft.c b/src/box/raft.c index 2c9ed11b6..8a034687b 100644 --- a/src/box/raft.c +++ b/src/box/raft.c @@ -213,7 +213,14 @@ box_raft_write(struct raft *raft, const struct raft_msg *msg) journal_entry_create(entry, 1, xrow_approx_len(&row), box_raft_write_cb, fiber()); - if (journal_write(entry) != 0 || entry->res < 0) { + /* + * A non-cancelable fiber is considered non-wake-able, generally. Raft + * follows this pattern of 'protection'. + */ + bool cancellable = fiber_set_cancellable(false); + bool ok = (journal_write(entry) == 0 && entry->res >= 0); + fiber_set_cancellable(cancellable); + if (!ok) { diag_set(ClientError, ER_WAL_IO); diag_log(); goto fail; diff --git a/src/box/raftlib.c b/src/box/raftlib.c index d28e51871..a1fca34cd 100644 --- a/src/box/raftlib.c +++ b/src/box/raftlib.c @@ -986,11 +986,13 @@ raft_worker_wakeup(struct raft *raft) fiber_set_joinable(raft->worker, true); } /* - * Don't wake the fiber if it writes something. Otherwise it would be a - * spurious wakeup breaking the WAL write not adapted to this. Also - * don't wakeup the current fiber - it leads to undefined behaviour. + * Don't wake the fiber if it writes something (not cancellable). + * Otherwise it would be a spurious wakeup breaking the WAL write not + * adapted to this. Also don't wakeup the current fiber - it leads to + * undefined behaviour. */ - if (!raft->is_write_in_progress && fiber() != raft->worker) + if ((raft->worker->flags & FIBER_IS_CANCELLABLE) != 0 && + fiber() != raft->worker) fiber_wakeup(raft->worker); } -- 2.24.3 (Apple Git-128)
next prev parent reply other threads:[~2020-11-19 23:46 UTC|newest] Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-11-19 23:45 [Tarantool-patches] [PATCH v2 00/16] Raft module, part 2 - relocation to src/lib/raft Vladislav Shpilevoy 2020-11-19 23:45 ` [Tarantool-patches] [PATCH v2 01/16] raft: move sources to raftlib.h/.c Vladislav Shpilevoy 2020-11-19 23:45 ` Vladislav Shpilevoy [this message] 2020-11-20 8:33 ` [Tarantool-patches] [PATCH v2 10/16] raft: make worker non-cancellable during WAL write Serge Petrenko 2020-11-19 23:45 ` [Tarantool-patches] [PATCH v2 11/16] raft: move worker fiber from Raft library to box Vladislav Shpilevoy 2020-11-20 9:06 ` Serge Petrenko 2020-11-19 23:46 ` [Tarantool-patches] [PATCH v2 12/16] raft: move synchro queue clear to the worker fiber Vladislav Shpilevoy 2020-11-20 9:07 ` Serge Petrenko 2020-11-19 23:46 ` [Tarantool-patches] [PATCH v2 13/16] raft: invoke update triggers within state machine Vladislav Shpilevoy 2020-11-20 9:10 ` Serge Petrenko 2020-11-19 23:46 ` [Tarantool-patches] [PATCH v2 14/16] raft: move RO summary update to box-Raft Vladislav Shpilevoy 2020-11-20 9:13 ` Serge Petrenko 2020-11-19 23:46 ` [Tarantool-patches] [PATCH v2 15/16] raft: introduce RaftError Vladislav Shpilevoy 2020-11-19 23:46 ` [Tarantool-patches] [PATCH v2 16/16] raft: move algorithm code to src/lib/raft Vladislav Shpilevoy 2020-11-19 23:46 ` [Tarantool-patches] [PATCH v2 02/16] raft: move box_raft_* to src/box/raft.h and .c Vladislav Shpilevoy 2020-11-19 23:46 ` [Tarantool-patches] [PATCH v2 03/16] raft: stop using replication_disconnect_timeout() Vladislav Shpilevoy 2020-11-19 23:46 ` [Tarantool-patches] [PATCH v2 04/16] raft: stop using replication_synchro_quorum Vladislav Shpilevoy 2020-11-19 23:46 ` [Tarantool-patches] [PATCH v2 05/16] raft: stop using instance_id Vladislav Shpilevoy 2020-11-19 23:46 ` [Tarantool-patches] [PATCH v2 06/16] raft: make raft_request.vclock constant Vladislav Shpilevoy 2020-11-19 23:46 ` [Tarantool-patches] [PATCH v2 07/16] raft: stop using replicaset.vclock Vladislav Shpilevoy 2020-11-19 23:46 ` [Tarantool-patches] [PATCH v2 08/16] raft: introduce vtab for disk and network Vladislav Shpilevoy 2020-11-19 23:46 ` [Tarantool-patches] [PATCH v2 09/16] raft: introduce raft_msg, drop xrow dependency Vladislav Shpilevoy 2020-11-20 9:14 ` [Tarantool-patches] [PATCH v2 00/16] Raft module, part 2 - relocation to src/lib/raft Serge Petrenko 2020-11-20 19:42 ` Vladislav Shpilevoy 2020-11-23 5:30 ` Alexander V. Tikhonov 2020-11-23 23:26 ` Vladislav Shpilevoy
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=268bcf29eb045de623c18c58942c07b2491658f0.1605829282.git.v.shpilevoy@tarantool.org \ --to=v.shpilevoy@tarantool.org \ --cc=sergepetrenko@tarantool.org \ --cc=tarantool-patches@dev.tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH v2 10/16] raft: make worker non-cancellable during WAL write' \ /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