Packages
ra
2.4.0
3.1.9
3.1.8
3.1.7
3.1.6
3.1.5
3.1.4
3.1.3
3.1.2
3.1.1
3.1.0
3.0.2
3.0.1
3.0.0
3.0.0-beta.1
2.17.3
2.17.2
2.17.1
2.17.0
2.16.13
2.16.12
2.16.11
2.16.10
2.16.9
2.16.8
2.16.7
2.16.6
2.16.5
2.16.4
2.16.3
2.16.2
2.16.1
2.16.0
2.16.0-pre.12
2.16.0-pre.11
2.16.0-pre.10
2.16.0-pre.9
2.16.0-pre.8
2.16.0-pre.7
2.16.0-pre.6
2.16.0-pre.5
2.16.0-pre.4
2.16.0-pre.3
2.16.0-pre.2
2.16.0-pre.1
2.15.4
2.15.3
2.15.2
2.15.1
2.15.0
2.14.0
2.13.6
2.13.5
2.13.4
2.13.3
2.13.2
2.13.1
2.13.0
2.13.0-pre.1
2.12.0
2.11.0
2.11.0-pre.1
2.10.2-pre.2
2.10.2-pre.1
2.10.1
2.10.0
2.10.0-pre.3
2.10.0-pre.2
2.10.0-pre.1
2.9.10-pre.1
2.9.1
2.9.1-pre.2
2.9.1-pre.1
2.9.0
2.8.0
retired
2.7.3
2.7.2
2.7.1
2.7.0
2.7.0-pre.3
2.7.0-pre.2
2.7.0-pre.1
2.6.3
2.6.2
2.6.1
2.6.0-pre.1
2.5.1
2.5.1-pre.1
2.5.0
2.4.9
2.4.8
2.4.7
2.4.6
2.4.5
2.4.4
2.4.3
2.4.2
retired
2.4.1
2.4.0
2.3.0
2.2.0
2.1.0
2.0.13
2.0.12
2.0.11
2.0.10
2.0.9
2.0.8
2.0.7
2.0.6
2.0.5
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.9.6
0.9.5
0.9.4
0.9.2
0.3.3
retired
0.3.2
retired
0.3.1
retired
Raft library
Current section
Files
Jump to
Current section
Files
src/ra_leaderboard.erl
%% This Source Code Form is subject to the terms of the Mozilla Public
%% License, v. 2.0. If a copy of the MPL was not distributed with this
%% file, You can obtain one at https://mozilla.org/MPL/2.0/.
%%
%% Copyright (c) 2017-2022 VMware, Inc. or its affiliates. All rights reserved.
%%
-module(ra_leaderboard).
-export([
init/0,
record/3,
clear/1,
lookup_leader/1,
lookup_members/1,
overview/0
]).
-spec init() -> ok.
init() ->
_ = ets:new(?MODULE, [set, named_table, public]),
ok.
-spec record(ra:cluster_name(), ra:server_id(), [ra:server_id()]) -> ok.
record(ClusterName, Leader, Members) ->
true = ets:insert(?MODULE, {ClusterName, Leader, Members}),
ok.
-spec clear(ra:cluster_name()) -> ok.
clear(ClusterName) ->
true = ets:delete(?MODULE, ClusterName),
ok.
-spec lookup_leader(ra:cluster_name()) -> ra:server_id() | undefined.
lookup_leader(ClusterName) ->
case lookup(ClusterName) of
{_, Leader, _} ->
Leader;
_ ->
undefined
end.
-spec lookup_members(ra:cluster_name()) -> [ra:server_id()] | undefined.
lookup_members(ClusterName) ->
case lookup(ClusterName) of
{_, _, Members} ->
Members;
_ ->
undefined
end.
-spec overview() -> list().
overview() ->
ets:tab2list(?MODULE).
%% internal
lookup(ClusterName) ->
try ets:lookup(?MODULE, ClusterName) of
[Record] ->
Record;
[] ->
undefined
catch
error:badarg ->
undefined
end.
-ifdef(TEST).
-include_lib("eunit/include/eunit.hrl").
lookup_leader_test() ->
ClusterName = <<"mah-cluster">>,
?assertEqual(undefined, lookup_leader(ClusterName)),
init(),
?assertEqual(undefined, lookup_leader(ClusterName)),
Me = {me, node()},
record(ClusterName, Me, [Me]),
?assertEqual(Me, lookup_leader(ClusterName)),
?assertEqual([Me], lookup_members(ClusterName)),
You = {you, node()},
record(ClusterName, You, [Me, You]),
?assertEqual(You, lookup_leader(ClusterName)),
?assertEqual([Me, You], lookup_members(ClusterName)),
ok.
-endif.