Skip to content

Commit ad6bb7d

Browse files
Merge pull request #427 from sile/fix-non-voter
Exclude `non_voter` server from quorum calculation
2 parents 29306c0 + 924c024 commit ad6bb7d

File tree

2 files changed

+23
-7
lines changed

2 files changed

+23
-7
lines changed

src/ra_server.erl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2916,7 +2916,7 @@ query_indexes(#{cfg := #cfg{id = Id},
29162916
query_index := QueryIndex}) ->
29172917
maps:fold(fun (PeerId, _, Acc) when PeerId == Id ->
29182918
Acc;
2919-
(_K, #{voter_status := #{membership := promotable}}, Acc) ->
2919+
(_K, #{voter_status := #{membership := Membership}}, Acc) when Membership =/= voter ->
29202920
Acc;
29212921
(_K, #{query_index := Idx}, Acc) ->
29222922
[Idx | Acc]
@@ -2928,7 +2928,7 @@ match_indexes(#{cfg := #cfg{id = Id},
29282928
{LWIdx, _} = ra_log:last_written(Log),
29292929
maps:fold(fun (PeerId, _, Acc) when PeerId == Id ->
29302930
Acc;
2931-
(_K, #{voter_status := #{membership := promotable}}, Acc) ->
2931+
(_K, #{voter_status := #{membership := Membership}}, Acc) when Membership =/= voter ->
29322932
Acc;
29332933
(_K, #{match_index := Idx}, Acc) ->
29342934
[Idx | Acc]
@@ -3246,7 +3246,7 @@ required_quorum(Cluster) ->
32463246

32473247
count_voters(Cluster) ->
32483248
maps:fold(
3249-
fun (_, #{voter_status := #{membership := promotable}}, Count) ->
3249+
fun (_, #{voter_status := #{membership := Membership}}, Count) when Membership =/= voter ->
32503250
Count;
32513251
(_, _, Count) ->
32523252
Count + 1

test/ra_2_SUITE.erl

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ init_per_testcase(TestCase, Config) ->
8686
ServerName2 = list_to_atom(atom_to_list(TestCase) ++ "2"),
8787
ServerName3 = list_to_atom(atom_to_list(TestCase) ++ "3"),
8888
ServerName4 = list_to_atom(atom_to_list(TestCase) ++ "4"),
89+
ServerName5 = list_to_atom(atom_to_list(TestCase) ++ "5"),
8990
[{test_case, TestCase},
9091
{modname, TestCase},
9192
{cluster_name, TestCase},
@@ -96,7 +97,9 @@ init_per_testcase(TestCase, Config) ->
9697
{uid3, atom_to_binary(ServerName3, utf8)},
9798
{server_id3, {ServerName3, node()}},
9899
{uid4, atom_to_binary(ServerName4, utf8)},
99-
{server_id4, {ServerName4, node()}}
100+
{server_id4, {ServerName4, node()}},
101+
{uid5, atom_to_binary(ServerName5, utf8)},
102+
{server_id5, {ServerName5, node()}}
100103
| Config].
101104

102105
enqueue(Server, Msg) ->
@@ -710,19 +713,32 @@ force_start_follower_as_single_member_nonvoter(Config) ->
710713
{ok, [_], ServerId3} = ra:members(ServerId3),
711714
ok = enqueue(ServerId3, msg2),
712715

713-
%% add a member
716+
%% add a promotable member
714717
ServerId4 = ?config(server_id4, Config),
715718
UId4 = ?config(uid4, Config),
716719
Conf4 = conf(ClusterName, UId4, ServerId4, PrivDir, [ServerId3]),
717-
{ok, _, _} = ra:add_member(ServerId3, #{id => ServerId4, membership => promotable, uid => <<"test">>}),
720+
{ok, _, _} = ra:add_member(ServerId3, #{id => ServerId4, membership => promotable, uid => <<"test4">>}),
718721
%% the membership has changed but member not running yet
719722
%% it is nonvoter and does not affect quorum size
720723
{ok, _, _} = ra:process_command(ServerId3, {enq, banana}),
721724
%% start new member
722-
ok = ra:start_server(?SYS, Conf4#{membership => promotable, uid => <<"test">>}),
725+
ok = ra:start_server(?SYS, Conf4#{membership => promotable, uid => <<"test4">>}),
723726
{ok, _, ServerId3} = ra:members(ServerId4),
724727
ok = enqueue(ServerId3, msg3),
725728

729+
%% add a non-voter member
730+
ServerId5 = ?config(server_id5, Config),
731+
UId5 = ?config(uid5, Config),
732+
Conf5 = conf(ClusterName, UId5, ServerId5, PrivDir, [ServerId3]),
733+
{ok, _, _} = ra:add_member(ServerId3, #{id => ServerId5, membership => non_voter, uid => <<"test5">>}),
734+
%% the membership has changed but member not running yet
735+
%% it is nonvoter and does not affect quorum size
736+
{ok, _, _} = ra:process_command(ServerId3, {enq, banana}),
737+
%% start new member
738+
ok = ra:start_server(?SYS, Conf5#{membership => non_voter, uid => <<"test5">>}),
739+
{ok, _, ServerId3} = ra:members(ServerId5),
740+
ok = enqueue(ServerId3, msg4),
741+
726742
ok.
727743

728744
initial_members_query(Config) ->

0 commit comments

Comments
 (0)