Tarantool development patches archive
 help / color / mirror / Atom feed
From: Serge Petrenko <sergepetrenko@tarantool.org>
To: kyukhin@tarantool.org, v.shpilevoy@tarantool.org
Cc: tarantool-patches@dev.tarantool.org
Subject: [Tarantool-patches] [PATCH] raft: fix an assertion failure on transition to voter
Date: Thu, 22 Oct 2020 13:44:56 +0300	[thread overview]
Message-ID: <20201022104456.51722-1-sergepetrenko@tarantool.org> (raw)

When an instance is configured as candidate, it has a leader death timer
ticking constantly to schedule an election as soon as leader disappears.
When the instance receives the leader's heartbeat, it resets the timer
to its initial value.

When being a voter, the instance ignores heartbeats, since it has
nothing to wait for. So its timer must be stopped. Otherwise it'll try
to schedule a new election and fail.

Stop the timer on transition from candidate to voter.
---
https://github.com/tarantool/tarantool/tree/sp/raft-crash-on-voter

 src/box/raft.c | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/src/box/raft.c b/src/box/raft.c
index b70f47006..4a8e54cac 100644
--- a/src/box/raft.c
+++ b/src/box/raft.c
@@ -952,12 +952,18 @@ raft_cfg_is_candidate(bool is_candidate)
 			 * until the new state is fully persisted.
 			 */
 		}
-	} else if (raft.state != RAFT_STATE_FOLLOWER) {
-		if (raft.state == RAFT_STATE_LEADER)
-			raft.leader = 0;
-		raft.state = RAFT_STATE_FOLLOWER;
-		/* State is visible and changed - broadcast. */
-		raft_schedule_broadcast();
+	} else {
+		if (raft.state != RAFT_STATE_LEADER) {
+			/* Do not wait for anything while being a voter. */
+			ev_timer_stop(loop(), &raft.timer);
+		}
+		if (raft.state != RAFT_STATE_FOLLOWER) {
+			if (raft.state == RAFT_STATE_LEADER)
+				raft.leader = 0;
+			raft.state = RAFT_STATE_FOLLOWER;
+			/* State is visible and changed - broadcast. */
+			raft_schedule_broadcast();
+		}
 	}
 	box_update_ro_summary();
 }
-- 
2.24.3 (Apple Git-128)

             reply	other threads:[~2020-10-22 10:45 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-22 10:44 Serge Petrenko [this message]
2020-10-22 11:05 ` Serge Petrenko

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=20201022104456.51722-1-sergepetrenko@tarantool.org \
    --to=sergepetrenko@tarantool.org \
    --cc=kyukhin@tarantool.org \
    --cc=tarantool-patches@dev.tarantool.org \
    --cc=v.shpilevoy@tarantool.org \
    --subject='Re: [Tarantool-patches] [PATCH] raft: fix an assertion failure on transition to voter' \
    /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