From: Serge Petrenko via Tarantool-patches <tarantool-patches@dev.tarantool.org> To: v.shpilevoy@tarantool.org, gorcunov@gmail.com Cc: tarantool-patches@dev.tarantool.org Subject: [Tarantool-patches] [PATCH v4 07/16] replication: send current Raft term in join response Date: Wed, 14 Jul 2021 21:25:35 +0300 [thread overview] Message-ID: <ecfe0f6e60782766d3a89f76f970a072bcb48d70.1626287002.git.sergepetrenko@tarantool.org> (raw) In-Reply-To: <cover.1626287002.git.sergepetrenko@tarantool.org> Make Raft nodes send out their latest persisted term to joining replicas. This is needed to avoid the situation when txn_limbo-managed 'promote greatest term' is greater than current Raft term. Otherwise the following may happen: replica joins off some instance and receives its latest limbo state. The state includes "greatest term seen" and makes limbo filter out any data coming from instances with smaller terms. Imagine that master this replica has joined from dies before replica has a chance to subscribe to it. Then it doesn't receive its current Raft term and start elections at smallest term possible, 2 (when there are no suitable Raft nodes besides the replica). Once the elections in a small term number are won, a ton of problems arises: starting with filtering out PROMOTE requests for "old" term and nop-ifying any data coming from terms smaller than "greatest term seen". Prerequisite #6034 --- src/box/applier.cc | 5 +++++ src/box/relay.cc | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/src/box/applier.cc b/src/box/applier.cc index 4088fcc21..92ec088ea 100644 --- a/src/box/applier.cc +++ b/src/box/applier.cc @@ -459,6 +459,11 @@ applier_wait_snapshot(struct applier *applier) if (xrow_decode_synchro(&row, &req) != 0) diag_raise(); txn_limbo_process(&txn_limbo, &req); + } else if (iproto_type_is_raft_request(row.type)) { + struct raft_request req; + if (xrow_decode_raft(&row, &req, NULL) != 0) + diag_raise(); + box_raft_recover(&req); } else if (row.type != IPROTO_JOIN_SNAPSHOT) { tnt_raise(ClientError, ER_UNKNOWN_REQUEST_TYPE, (uint32_t)row.type); diff --git a/src/box/relay.cc b/src/box/relay.cc index 4b102a777..70f1a045b 100644 --- a/src/box/relay.cc +++ b/src/box/relay.cc @@ -428,7 +428,9 @@ relay_initial_join(int fd, uint64_t sync, struct vclock *vclock, diag_raise(); struct synchro_request req; + struct raft_request raft_req; txn_limbo_checkpoint(&txn_limbo, &req); + box_raft_checkpoint_local(&raft_req); /* Respond to the JOIN request with the current vclock. */ struct xrow_header row; @@ -451,6 +453,10 @@ relay_initial_join(int fd, uint64_t sync, struct vclock *vclock, row.sync = sync; coio_write_xrow(&relay->io, &row); + xrow_encode_raft(&row, &fiber()->gc, &raft_req); + row.sync = sync; + coio_write_xrow(&relay->io, &row); + /* Mark the end of the metadata stream. */ row.type = IPROTO_JOIN_SNAPSHOT; coio_write_xrow(&relay->io, &row); -- 2.30.1 (Apple Git-130)
next prev parent reply other threads:[~2021-07-14 18:29 UTC|newest] Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-07-14 18:25 [Tarantool-patches] [PATCH v4 00/16] forbid implicit limbo ownership transition Serge Petrenko via Tarantool-patches 2021-07-14 18:25 ` [Tarantool-patches] [PATCH v4 01/16] replication: always send raft state to subscribers Serge Petrenko via Tarantool-patches 2021-07-14 18:25 ` [Tarantool-patches] [PATCH v4 02/16] txn_limbo: fix promote term filtering Serge Petrenko via Tarantool-patches 2021-07-14 18:25 ` [Tarantool-patches] [PATCH v4 03/16] txn_limbo: persist the latest effective promote in snapshot Serge Petrenko via Tarantool-patches 2021-07-14 18:25 ` [Tarantool-patches] [PATCH v4 04/16] replication: encode version in JOIN request Serge Petrenko via Tarantool-patches 2021-07-14 18:25 ` [Tarantool-patches] [PATCH v4 05/16] replication: add META stage to JOIN Serge Petrenko via Tarantool-patches 2021-07-14 18:25 ` [Tarantool-patches] [PATCH v4 06/16] replication: send latest effective promote in initial join Serge Petrenko via Tarantool-patches 2021-07-21 23:24 ` Vladislav Shpilevoy via Tarantool-patches 2021-07-23 7:44 ` Sergey Petrenko via Tarantool-patches 2021-07-26 23:43 ` Vladislav Shpilevoy via Tarantool-patches 2021-07-14 18:25 ` Serge Petrenko via Tarantool-patches [this message] 2021-07-21 23:24 ` [Tarantool-patches] [PATCH v4 07/16] replication: send current Raft term in join response Vladislav Shpilevoy via Tarantool-patches 2021-07-23 7:44 ` Sergey Petrenko via Tarantool-patches 2021-07-26 23:43 ` Vladislav Shpilevoy via Tarantool-patches 2021-07-29 20:46 ` Sergey Petrenko via Tarantool-patches 2021-07-14 18:25 ` [Tarantool-patches] [PATCH v4 08/16] raft: refactor raft_new_term() Serge Petrenko via Tarantool-patches 2021-07-14 18:25 ` [Tarantool-patches] [PATCH v4 09/16] box: split promote() into reasonable parts Serge Petrenko via Tarantool-patches 2021-07-21 23:26 ` Vladislav Shpilevoy via Tarantool-patches 2021-07-23 7:45 ` Sergey Petrenko via Tarantool-patches 2021-07-26 23:44 ` Vladislav Shpilevoy via Tarantool-patches 2021-07-29 20:46 ` Sergey Petrenko via Tarantool-patches 2021-07-14 18:25 ` [Tarantool-patches] [PATCH v4 10/16] box: make promote always bump the term Serge Petrenko via Tarantool-patches 2021-07-26 23:45 ` Vladislav Shpilevoy via Tarantool-patches 2021-07-29 20:46 ` Sergey Petrenko via Tarantool-patches 2021-07-14 18:25 ` [Tarantool-patches] [PATCH v4 11/16] box: make promote on the current leader a no-op Serge Petrenko via Tarantool-patches 2021-07-21 23:26 ` Vladislav Shpilevoy via Tarantool-patches 2021-07-23 7:45 ` Sergey Petrenko via Tarantool-patches 2021-07-14 18:25 ` [Tarantool-patches] [PATCH v4 12/16] box: fix an assertion failure after a spurious wakeup in promote Serge Petrenko via Tarantool-patches 2021-07-21 23:29 ` Vladislav Shpilevoy via Tarantool-patches 2021-07-23 7:45 ` Sergey Petrenko via Tarantool-patches 2021-07-14 18:25 ` [Tarantool-patches] [PATCH v4 13/16] box: allow calling promote on a candidate Serge Petrenko via Tarantool-patches 2021-07-15 14:06 ` Serge Petrenko via Tarantool-patches 2021-07-14 18:25 ` [Tarantool-patches] [PATCH v4 14/16] box: extract promote() settings to a separate method Serge Petrenko via Tarantool-patches 2021-07-14 18:25 ` [Tarantool-patches] [PATCH v4 15/16] replication: forbid implicit limbo owner transition Serge Petrenko via Tarantool-patches 2021-07-14 18:25 ` [Tarantool-patches] [PATCH v4 16/16] box: introduce `box.ctl.demote` Serge Petrenko via Tarantool-patches 2021-07-15 17:13 ` Serge Petrenko via Tarantool-patches 2021-07-15 20:11 ` [Tarantool-patches] [PATCH v4 17/16] replication: fix flaky election_qsync.test Serge Petrenko via Tarantool-patches 2021-07-26 23:43 ` [Tarantool-patches] [PATCH v4 00/16] forbid implicit limbo ownership transition Vladislav Shpilevoy via Tarantool-patches 2021-07-29 20:47 ` Sergey Petrenko 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=ecfe0f6e60782766d3a89f76f970a072bcb48d70.1626287002.git.sergepetrenko@tarantool.org \ --to=tarantool-patches@dev.tarantool.org \ --cc=gorcunov@gmail.com \ --cc=sergepetrenko@tarantool.org \ --cc=v.shpilevoy@tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH v4 07/16] replication: send current Raft term in join response' \ /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