From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp17.mail.ru (smtp17.mail.ru [94.100.176.154]) (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 118E644643A for ; Tue, 17 Nov 2020 11:15:06 +0300 (MSK) References: <37cac52adcfbc1ff4caf0399fec9d2f0213c9c0b.1605570907.git.v.shpilevoy@tarantool.org> From: Serge Petrenko Message-ID: <5c4186bd-f6b7-d765-9940-82dfca945082@tarantool.org> Date: Tue, 17 Nov 2020 11:15:05 +0300 MIME-Version: 1.0 In-Reply-To: <37cac52adcfbc1ff4caf0399fec9d2f0213c9c0b.1605570907.git.v.shpilevoy@tarantool.org> Content-Type: text/plain; charset="utf-8"; format="flowed" Content-Transfer-Encoding: 8bit Content-Language: ru Subject: Re: [Tarantool-patches] [PATCH 03/12] raft: stop using replication_disconnect_timeout() List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Vladislav Shpilevoy , tarantool-patches@dev.tarantool.org, gorcunov@gmail.com LGTM. 17.11.2020 03:02, Vladislav Shpilevoy пишет: > Raft is being moved to a separate library in src/lib. It means, > it can't depend on anything from box/, including global > replication parameters such as replication_timeout, and functions > like replication_disconnect_timeout(). > > The patch makes raft stop using replication_disconnect_timeout(). > Instead, it stores death timeout in struct raft. It is configured > by box simultaneously with replication_timeout. > > Part of #5303 > --- > src/box/box.cc | 2 +- > src/box/raftlib.c | 13 ++++++------- > src/box/raftlib.h | 10 +++++++--- > 3 files changed, 14 insertions(+), 11 deletions(-) > > diff --git a/src/box/box.cc b/src/box/box.cc > index 8dd92a5f5..25673ed42 100644 > --- a/src/box/box.cc > +++ b/src/box/box.cc > @@ -890,7 +890,7 @@ void > box_set_replication_timeout(void) > { > replication_timeout = box_check_replication_timeout(); > - raft_cfg_death_timeout(box_raft()); > + raft_cfg_death_timeout(box_raft(), replication_disconnect_timeout()); > } > > void > diff --git a/src/box/raftlib.c b/src/box/raftlib.c > index 3867c63e0..c156d6f46 100644 > --- a/src/box/raftlib.c > +++ b/src/box/raftlib.c > @@ -804,8 +804,7 @@ raft_sm_wait_leader_dead(struct raft *raft) > assert(raft->is_candidate); > assert(raft->state == RAFT_STATE_FOLLOWER); > assert(raft->leader != 0); > - double death_timeout = replication_disconnect_timeout(); > - ev_timer_set(&raft->timer, death_timeout, death_timeout); > + ev_timer_set(&raft->timer, raft->death_timeout, raft->death_timeout); > ev_timer_start(loop(), &raft->timer); > } > > @@ -817,8 +816,7 @@ raft_sm_wait_leader_found(struct raft *raft) > assert(raft->is_candidate); > assert(raft->state == RAFT_STATE_FOLLOWER); > assert(raft->leader == 0); > - double death_timeout = replication_disconnect_timeout(); > - ev_timer_set(&raft->timer, death_timeout, death_timeout); > + ev_timer_set(&raft->timer, raft->death_timeout, raft->death_timeout); > ev_timer_start(loop(), &raft->timer); > } > > @@ -1012,14 +1010,14 @@ raft_cfg_election_quorum(struct raft *raft) > } > > void > -raft_cfg_death_timeout(struct raft *raft) > +raft_cfg_death_timeout(struct raft *raft, double death_timeout) > { > + raft->death_timeout = death_timeout; > if (raft->state == RAFT_STATE_FOLLOWER && raft->is_candidate && > raft->leader != 0) { > assert(ev_is_active(&raft->timer)); > - double death_timeout = replication_disconnect_timeout(); > double timeout = ev_timer_remaining(loop(), &raft->timer) - > - raft->timer.at + death_timeout; > + raft->timer.at + raft->death_timeout; > ev_timer_stop(loop(), &raft->timer); > ev_timer_set(&raft->timer, timeout, timeout); > ev_timer_start(loop(), &raft->timer); > @@ -1080,6 +1078,7 @@ raft_create(struct raft *raft) > .volatile_term = 1, > .term = 1, > .election_timeout = 5, > + .death_timeout = 5, > }; > ev_timer_init(&raft->timer, raft_sm_schedule_new_election_cb, 0, 0); > raft->timer.data = raft; > diff --git a/src/box/raftlib.h b/src/box/raftlib.h > index 805f69d64..b33a20326 100644 > --- a/src/box/raftlib.h > +++ b/src/box/raftlib.h > @@ -156,6 +156,11 @@ struct raft { > struct fiber *worker; > /** Configured election timeout in seconds. */ > double election_timeout; > + /** > + * Leader death timeout, after which it is considered dead and new > + * elections can be started. > + */ > + double death_timeout; > /** > * Trigger invoked each time any of the Raft node visible attributes are > * changed. > @@ -229,11 +234,10 @@ raft_cfg_election_quorum(struct raft *raft); > > /** > * Configure Raft leader death timeout. I.e. number of seconds without > - * heartbeats from the leader to consider it dead. There is no a separate > - * option. Raft uses replication timeout for that. > + * heartbeats from the leader to consider it dead. > */ > void > -raft_cfg_death_timeout(struct raft *raft); > +raft_cfg_death_timeout(struct raft *raft, double death_timeout); > > /** > * Bump the term. When it is persisted, the node checks if there is a leader, -- Serge Petrenko