Skip to content

Commit 4fc73bd

Browse files
author
Alex Valiushko
committed
insert voter status in ets ra_state
1 parent da56fa4 commit 4fc73bd

File tree

4 files changed

+22
-10
lines changed

4 files changed

+22
-10
lines changed

src/ra_directory.erl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,11 +178,13 @@ overview(System) when is_atom(System) ->
178178
States = maps:from_list(ets:tab2list(ra_state)),
179179
Snaps = maps:from_list(ets:tab2list(ra_log_snapshot_state)),
180180
lists:foldl(fun ({UId, Pid, Parent, ServerName, ClusterName}, Acc) ->
181+
{State, Voter} = maps:get(ServerName, States, {undefined, undefined}),
181182
Acc#{ServerName =>
182183
#{uid => UId,
183184
pid => Pid,
184185
parent => Parent,
185-
state => maps:get(ServerName, States, undefined),
186+
state => State,
187+
voter => Voter,
186188
cluster_name => ClusterName,
187189
snapshot_state => maps:get(UId, Snaps,
188190
undefined)}}

src/ra_server.erl

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1395,11 +1395,7 @@ overview(#{cfg := #cfg{effective_machine_module = MacMod} = Cfg,
13951395
cluster_index_term,
13961396
query_index
13971397
], State),
1398-
% implicit voter status for initial leaders
1399-
O1 = case O0 of
1400-
#{voter := _} -> O0;
1401-
_ -> O0#{voter => yes}
1402-
end,
1398+
O1 = O0#{voter => maps:get(voter, O0, yes)}, % implicit voter for initial leaders
14031399
O = maps:merge(O1, cfg_to_map(Cfg)),
14041400
LogOverview = ra_log:overview(Log),
14051401
MacOverview = ra_machine:overview(MacMod, MacState),

src/ra_server_proc.erl

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -783,9 +783,17 @@ follower(_, tick_timeout, State0) ->
783783
set_tick_timer(State, Actions)};
784784
follower({call, From}, {log_fold, Fun, Term}, State) ->
785785
fold_log(From, Fun, Term, State);
786-
follower(EventType, Msg, State0) ->
786+
follower(EventType, Msg, #state{conf = #conf{name = Name},
787+
server_state = SS0} = State0) ->
788+
Voter0 = maps:get(voter, SS0, yes),
787789
case handle_follower(Msg, State0) of
788-
{follower, State1, Effects} ->
790+
{follower, #state{server_state = SS1} = State1, Effects} ->
791+
case maps:get(voter, SS1, yes) of
792+
Voter0 ->
793+
ok;
794+
Voter ->
795+
true = ets:insert(ra_state, {Name, {follower, Voter}})
796+
end,
789797
{State2, Actions} = ?HANDLE_EFFECTS(Effects, EventType, State1),
790798
State = follower_leader_change(State0, State2),
791799
{keep_state, State, Actions};
@@ -1028,7 +1036,8 @@ format_status(Opt, [_PDict, StateName,
10281036
handle_enter(RaftState, OldRaftState,
10291037
#state{conf = #conf{name = Name},
10301038
server_state = ServerState0} = State) ->
1031-
true = ets:insert(ra_state, {Name, RaftState}),
1039+
Voter = maps:get(voter, ServerState0, yes),
1040+
true = ets:insert(ra_state, {Name, {RaftState, Voter}}),
10321041
{ServerState, Effects} = ra_server:handle_state_enter(RaftState,
10331042
ServerState0),
10341043
case RaftState == leader orelse OldRaftState == leader of

test/ra_SUITE.erl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1040,7 +1040,12 @@ consistent_promotion(Config) ->
10401040
validate_state_on_node(N3, 10),
10411041
% nodes agree that all are voters after catch-up
10421042
All = [N1, N2, N3],
1043-
lists:map(fun(O) ->
1043+
#{servers := Servers} = ra:overview(?SYS),
1044+
lists:map(fun({Name, _}) -> % in ets
1045+
#{Name := #{voter := Voter}} = Servers,
1046+
?assertEqual(yes, Voter)
1047+
end, All),
1048+
lists:map(fun(O) -> % in server state
10441049
?assert(is_voter(O)),
10451050
?assertEqual(All, voters(O)),
10461051
?assertEqual([], nonvoters(O))

0 commit comments

Comments
 (0)