From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from [87.239.111.99] (localhost [127.0.0.1]) by dev.tarantool.org (Postfix) with ESMTP id 277CD6EC5F; Tue, 20 Apr 2021 12:28:10 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 dev.tarantool.org 277CD6EC5F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=tarantool.org; s=dev; t=1618910890; bh=zNXsEKhVMMwXNglCaYetaMeATHObT9x6ofzRk8Zsvv4=; h=To:Cc:References:Date:In-Reply-To:Subject:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=Kehafz0nrQXzLIWLBUFL/ggwBsKrUXsd0KkvCG/XD7LXcp9USbeX5gdxwfgedK6Kx 4GjpzhVDkMxETPQxN5XZfDZ/CCd3rGcLSaYbY/CYPnWnemhfZQqyjHLwgmCrfSKqQq ODmyqJRd7JiYrdxwh4uIH3sD3fgozaES3BinUVNI= Received: from smtp29.i.mail.ru (smtp29.i.mail.ru [94.100.177.89]) (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 B60C26EC5F for ; Tue, 20 Apr 2021 12:28:08 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 dev.tarantool.org B60C26EC5F Received: by smtp29.i.mail.ru with esmtpa (envelope-from ) id 1lYmfv-0002Ku-W4; Tue, 20 Apr 2021 12:28:08 +0300 To: Vladislav Shpilevoy , gorcunov@gmail.com Cc: tarantool-patches@dev.tarantool.org References: <7ff56892-5253-174b-a97b-7800100a58db@tarantool.org> <94422851-f0dd-8995-fbe8-78bbd90680e7@tarantool.org> <9fe79f1b-657c-9437-cad7-637c842b2302@tarantool.org> Message-ID: <4081e491-129a-488c-cf34-abff205b092c@tarantool.org> Date: Tue, 20 Apr 2021 12:28:07 +0300 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Thunderbird/78.9.1 MIME-Version: 1.0 In-Reply-To: <9fe79f1b-657c-9437-cad7-637c842b2302@tarantool.org> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-GB X-7564579A: 646B95376F6C166E X-77F55803: 4F1203BC0FB41BD92FFCB8E6708E7480B1C8842CE613979723F2FB4628545A35182A05F5380850400BFD10E13BD498C00A91374C9088DC02FFBB0954F6AACEE06723D71B0E4E9E3B X-7FA49CB5: FF5795518A3D127A4AD6D5ED66289B5278DA827A17800CE70E516B62D673F89BEA1F7E6F0F101C67BD4B6F7A4D31EC0BCC500DACC3FED6E28638F802B75D45FF8AA50765F79006371E92E38DA2D50EB18638F802B75D45FF914D58D5BE9E6BC1A93B80C6DEB9DEE97C6FB206A91F05B2EF41D3774E6576AC9403B709578E57D3618001F51B5FD3F9D2E47CDBA5A96583C09775C1D3CA48CFE97D2AE7161E217F117882F4460429724CE54428C33FAD30A8DF7F3B2552694AC26CFBAC0749D213D2E47CDBA5A9658378DA827A17800CE78A80DFD3A0D2C7BC9FA2833FD35BB23DF004C906525384302BEBFE083D3B9BA71A620F70A64A45A98AA50765F79006372E808ACE2090B5E1725E5C173C3A84C3C5EA940A35A165FF2DBA43225CD8A89FB26E97DCB74E625257739F23D657EF2BB5C8C57E37DE458BEDA766A37F9254B7 X-C1DE0DAB: 0D63561A33F958A582B22724443B1264646F740E92816FDEF25C09985F17A3E8D59269BC5F550898D99A6476B3ADF6B47008B74DF8BB9EF7333BD3B22AA88B938A852937E12ACA7502E6951B79FF9A3F410CA545F18667F91A7EA1CDA0B5A7A0 X-C8649E89: 4E36BF7865823D7055A7F0CF078B5EC49A30900B95165D34C53D1911AD7E41996E01F79408B8751E14E89CD018311A8B6FBBD6D429D5F259522E1E40D1086B641D7E09C32AA3244C7799CFAA245BAC339CC11FF90AD008277101BF96129E4011FACE5A9C96DEB163 X-D57D3AED: 3ZO7eAau8CL7WIMRKs4sN3D3tLDjz0dLbV79QFUyzQ2Ujvy7cMT6pYYqY16iZVKkSc3dCLJ7zSJH7+u4VD18S7Vl4ZUrpaVfd2+vE6kuoey4m4VkSEu530nj6fImhcD4MUrOEAnl0W826KZ9Q+tr5ycPtXkTV4k65bRjmOUUP8cvGozZ33TWg5HZplvhhXbhDGzqmQDTd6OAevLeAnq3Ra9uf7zvY2zzsIhlcp/Y7m53TZgf2aB4JOg4gkr2biojlPRl29Bx4WF9yXCUUqH3SA== X-Mailru-Sender: 3B9A0136629DC9125D61937A2360A4465282EC6E22DB73F280B61F7BDE05454E9AA5BE4ADF09234E424AE0EB1F3D1D21E2978F233C3FAE6EE63DB1732555E4A8EE80603BA4A5B0BC112434F685709FCF0DA7A0AF5A3A8387 X-Mras: Ok Subject: Re: [Tarantool-patches] [PATCH v4 09/12] raft: introduce raft_start/stop_candidate X-BeenThere: tarantool-patches@dev.tarantool.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Serge Petrenko via Tarantool-patches Reply-To: Serge Petrenko Errors-To: tarantool-patches-bounces@dev.tarantool.org Sender: "Tarantool-patches" 20.04.2021 01:35, Vladislav Shpilevoy пишет: > Good job on the patch! > > You didn't cover the stop_candidate call with demote flag true in the > unit tests. I added my commit on top of this one. See it on the branch > and below. Squash if you agree. Otherwise lets discuss. > > ==================== Thanks for the help! Your changes look good, I squashed them. > diff --git a/test/unit/raft.c b/test/unit/raft.c > index a718ab3f4..29e48da13 100644 > --- a/test/unit/raft.c > +++ b/test/unit/raft.c > @@ -1270,29 +1270,50 @@ raft_test_too_long_wal_write(void) > static void > raft_test_start_stop_candidate(void) > { > - raft_start_test(4); > + raft_start_test(8); > struct raft_node node; > raft_node_create(&node); > > raft_node_cfg_is_candidate(&node, false); > raft_node_cfg_election_quorum(&node, 1); > > - raft_start_candidate(&node.raft); > + raft_node_start_candidate(&node); > raft_run_next_event(); > is(node.raft.state, RAFT_STATE_LEADER, "became leader after " > - "start_candidate"); > - raft_stop_candidate(&node.raft, false); > + "start candidate"); > + > + raft_node_stop_candidate(&node); > raft_run_for(node.cfg_death_timeout); > is(node.raft.state, RAFT_STATE_LEADER, "remain leader after " > - "stop_candidate"); > + "stop candidate"); > + > + raft_node_demote_candidate(&node); > + is(node.raft.state, RAFT_STATE_FOLLOWER, "demote drops a non-candidate " > + "leader to a follower"); > + > + /* > + * Ensure the non-candidate leader is demoted when sees a new term, and > + * does not try election again. > + */ > + raft_node_start_candidate(&node); > + raft_run_next_event(); > + raft_node_stop_candidate(&node); > + is(node.raft.state, RAFT_STATE_LEADER, "non-candidate but still " > + "leader"); > > is(raft_node_send_vote_request(&node, > - 3 /* Term. */, > + 4 /* Term. */, > "{}" /* Vclock. */, > 2 /* Source. */ > ), 0, "vote request from 2"); > is(node.raft.state, RAFT_STATE_FOLLOWER, "demote once new election " > - "starts"); > + "starts"); > + > + raft_run_for(node.cfg_election_timeout * 2); > + is(node.raft.state, RAFT_STATE_FOLLOWER, "still follower"); > + is(node.raft.term, 4, "still the same term"); > + > + raft_node_destroy(&node); > raft_finish_test(); > } > > diff --git a/test/unit/raft.result b/test/unit/raft.result > index f9a8f249b..3a3dc5dd2 100644 > --- a/test/unit/raft.result > +++ b/test/unit/raft.result > @@ -221,11 +221,15 @@ ok 12 - subtests > ok 13 - subtests > *** raft_test_too_long_wal_write: done *** > *** raft_test_start_stop_candidate *** > - 1..4 > - ok 1 - became leader after start_candidate > - ok 2 - remain leader after stop_candidate > - ok 3 - vote request from 2 > - ok 4 - demote once new election starts > + 1..8 > + ok 1 - became leader after start candidate > + ok 2 - remain leader after stop candidate > + ok 3 - demote drops a non-candidate leader to a follower > + ok 4 - non-candidate but still leader > + ok 5 - vote request from 2 > + ok 6 - demote once new election starts > + ok 7 - still follower > + ok 8 - still the same term > ok 14 - subtests > *** raft_test_start_stop_candidate: done *** > *** main_f: done *** > diff --git a/test/unit/raft_test_utils.c b/test/unit/raft_test_utils.c > index b8735f373..452c05c81 100644 > --- a/test/unit/raft_test_utils.c > +++ b/test/unit/raft_test_utils.c > @@ -387,6 +387,27 @@ raft_node_unblock(struct raft_node *node) > } > } > > +void > +raft_node_start_candidate(struct raft_node *node) > +{ > + assert(raft_node_is_started(node)); > + raft_start_candidate(&node->raft); > +} > + > +void > +raft_node_stop_candidate(struct raft_node *node) > +{ > + assert(raft_node_is_started(node)); > + raft_stop_candidate(&node->raft, false); > +} > + > +void > +raft_node_demote_candidate(struct raft_node *node) > +{ > + assert(raft_node_is_started(node)); > + raft_stop_candidate(&node->raft, true); > +} > + > void > raft_node_cfg_is_enabled(struct raft_node *node, bool value) > { > diff --git a/test/unit/raft_test_utils.h b/test/unit/raft_test_utils.h > index bc3db0c2a..5f8618716 100644 > --- a/test/unit/raft_test_utils.h > +++ b/test/unit/raft_test_utils.h > @@ -208,6 +208,23 @@ raft_node_block(struct raft_node *node); > void > raft_node_unblock(struct raft_node *node); > > +/** > + * Make the node candidate, and maybe start election if a leader is not known. > + */ > +void > +raft_node_start_candidate(struct raft_node *node); > + > +/** > + * Make the node non-candidate for next elections, but if it is a leader right > + * now, it will stay a leader. > + */ > +void > +raft_node_stop_candidate(struct raft_node *node); > + > +/** Stop the candidate and remove its leader role if present. */ > +void > +raft_node_demote_candidate(struct raft_node *node); > + > /** Configuration methods. */ > > void -- Serge Petrenko