From: Vladislav Shpilevoy <v.shpilevoy@tarantool.org> To: tarantool-patches@dev.tarantool.org, sergepetrenko@tarantool.org Subject: [Tarantool-patches] [PATCH 4/6] raft: introduce on_update trigger Date: Wed, 14 Oct 2020 01:28:30 +0200 [thread overview] Message-ID: <93da596e063b426b8571cd639ffea176b96eebb2.1602631481.git.v.shpilevoy@tarantool.org> (raw) In-Reply-To: <cover.1602631481.git.v.shpilevoy@tarantool.org> Raft state machine now has a trigger invoked each time when any of the visible Raft attributes is changed: state, term, vote. The trigger is needed to commit synchronous transactions of an old leader, when a new leader is elected. This is done via a trigger so as not to depend on box in raft code too much. That would make it harder to extract it into a new module later. The trigger is executed in the Raft worker fiber, so as not to stop the state machine transitions anywhere, which currently don't contain a single yield. And the synchronous transaction queue clearance requires a yield, to write CONFIRM and ROLLBACK records to WAL. Part of #5339 --- src/box/raft.c | 8 ++++++++ src/box/raft.h | 13 +++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/box/raft.c b/src/box/raft.c index ff28e7f08..8c127f268 100644 --- a/src/box/raft.c +++ b/src/box/raft.c @@ -643,6 +643,7 @@ raft_worker_handle_broadcast(void) } replicaset_foreach(replica) relay_push_raft(replica->relay, &req); + trigger_run(&raft.on_update, NULL); raft.is_broadcast_scheduled = false; } @@ -903,6 +904,12 @@ raft_serialize_for_disk(struct raft_request *req) req->vote = raft.vote; } +void +raft_on_update(struct trigger *trigger) +{ + trigger_add(&raft.on_update, trigger); +} + void raft_cfg_is_enabled(bool is_enabled) { @@ -1025,4 +1032,5 @@ void raft_init(void) { ev_timer_init(&raft.timer, raft_sm_schedule_new_election_cb, 0, 0); + rlist_create(&raft.on_update); } diff --git a/src/box/raft.h b/src/box/raft.h index be77a5473..82d5aa442 100644 --- a/src/box/raft.h +++ b/src/box/raft.h @@ -32,6 +32,7 @@ #include <stdint.h> #include <stdbool.h> #include "tarantool_ev.h" +#include "trigger.h" #if defined(__cplusplus) extern "C" { @@ -150,6 +151,11 @@ struct raft { struct fiber *worker; /** Configured election timeout in seconds. */ double election_timeout; + /** + * Trigger invoked each time any of the Raft node visible attributes are + * changed. + */ + struct rlist on_update; }; extern struct raft raft; @@ -251,6 +257,13 @@ raft_serialize_for_network(struct raft_request *req, struct vclock *vclock); void raft_serialize_for_disk(struct raft_request *req); +/** + * Add a trigger invoked each time any of the Raft node visible attributes are + * changed. + */ +void +raft_on_update(struct trigger *trigger); + /** Initialize Raft global data structures. */ void raft_init(void); -- 2.21.1 (Apple Git-122.3)
next prev parent reply other threads:[~2020-10-13 23:28 UTC|newest] Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-10-13 23:28 [Tarantool-patches] [PATCH 0/6] Raft auto-commit Vladislav Shpilevoy 2020-10-13 23:28 ` [Tarantool-patches] [PATCH 1/6] test: add '_stress' suffix to election_qsync test Vladislav Shpilevoy 2020-10-13 23:28 ` [Tarantool-patches] [PATCH 2/6] raft: factor out the code to wakeup worker fiber Vladislav Shpilevoy 2020-10-14 13:29 ` Cyrill Gorcunov 2020-10-14 22:40 ` Vladislav Shpilevoy 2020-10-15 6:50 ` Cyrill Gorcunov 2020-10-13 23:28 ` [Tarantool-patches] [PATCH 3/6] raft: new candidate should wait for leader death Vladislav Shpilevoy 2020-10-13 23:28 ` Vladislav Shpilevoy [this message] 2020-10-13 23:28 ` [Tarantool-patches] [PATCH 5/6] raft: auto-commit transactions of the old leader Vladislav Shpilevoy 2020-10-13 23:28 ` [Tarantool-patches] [PATCH 6/6] qsync: reset confirmed lsn in limbo on owner change Vladislav Shpilevoy 2020-11-24 23:23 ` Vladislav Shpilevoy 2020-10-14 7:34 ` [Tarantool-patches] [PATCH 0/6] Raft auto-commit Serge Petrenko 2020-10-14 22:40 ` 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=93da596e063b426b8571cd639ffea176b96eebb2.1602631481.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 4/6] raft: introduce on_update trigger' \ /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