From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp32.i.mail.ru (smtp32.i.mail.ru [94.100.177.92]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id 39FEF469719 for ; Thu, 22 Oct 2020 13:45:10 +0300 (MSK) From: Serge Petrenko Date: Thu, 22 Oct 2020 13:44:56 +0300 Message-Id: <20201022104456.51722-1-sergepetrenko@tarantool.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [Tarantool-patches] [PATCH] raft: fix an assertion failure on transition to voter List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: kyukhin@tarantool.org, v.shpilevoy@tarantool.org Cc: tarantool-patches@dev.tarantool.org 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)