chore(dsraft): provide more details when replica is unready

This commit is contained in:
Andrew Mayorov 2024-07-12 17:05:16 +02:00
parent 70a760850f
commit 8e8b382ec0
No known key found for this signature in database
GPG Key ID: 2837C62ACFBFED5D
1 changed files with 14 additions and 9 deletions

View File

@ -266,20 +266,20 @@ remove_server(DB, Shard, Server) ->
end. end.
-spec server_info -spec server_info
(readiness, server()) -> ready | {unready, _Status, _Membership} | unknown; (readiness, server()) -> ready | {unready, _Details} | unknown;
(leader, server()) -> server() | unknown; (leader, server()) -> server() | unknown;
(uid, server()) -> _UID :: binary() | unknown. (uid, server()) -> _UID :: binary() | unknown.
server_info(readiness, Server) -> server_info(readiness, Server) ->
%% NOTE %% NOTE
%% Server is ready if it's either the leader or a follower with voter "membership" %% Server is ready if it's either the leader or a follower with voter "membership"
%% status (meaning it was promoted after catching up with the log). %% status (meaning it was promoted after catching up with the log).
case current_leader(Server) of case ra:members(Server) of
Server -> {ok, _Servers, Server} ->
ready; ready;
Leader when Leader /= unknown -> {ok, _Servers, Leader} ->
member_info(readiness, Server, Leader); member_info(readiness, Server, Leader);
unknown -> Error ->
unknown {unready, {leader_unavailable, Error}}
end; end;
server_info(leader, Server) -> server_info(leader, Server) ->
current_leader(Server); current_leader(Server);
@ -287,8 +287,13 @@ server_info(uid, Server) ->
maps:get(uid, ra_overview(Server), unknown). maps:get(uid, ra_overview(Server), unknown).
member_info(readiness, Server, Leader) -> member_info(readiness, Server, Leader) ->
Cluster = maps:get(cluster, ra_overview(Leader), #{}), case ra:member_overview(Leader) of
member_readiness(maps:get(Server, Cluster, #{})). {ok, Overview = #{}, _Leader} ->
Cluster = maps:get(cluster, Overview, #{}),
member_readiness(maps:get(Server, Cluster, #{}));
Error ->
{unready, {leader_overview_unavailable, Error}}
end.
current_leader(Server) -> current_leader(Server) ->
%% NOTE: This call will block until the leader is known, or until the timeout. %% NOTE: This call will block until the leader is known, or until the timeout.
@ -304,7 +309,7 @@ member_readiness(#{status := Status, voter_status := #{membership := Membership}
normal when Membership =:= voter -> normal when Membership =:= voter ->
ready; ready;
_Other -> _Other ->
{unready, Status, Membership} {unready, {catching_up, Status, Membership}}
end; end;
member_readiness(#{}) -> member_readiness(#{}) ->
unknown. unknown.