wip(dsrepl): avoid contacting offline nodes prematurely

This commit is contained in:
Andrew Mayorov 2024-03-26 18:13:30 +01:00
parent 0b69c8b7f3
commit c6085a6ab0
No known key found for this signature in database
GPG Key ID: 2837C62ACFBFED5D
1 changed files with 20 additions and 2 deletions

View File

@ -82,7 +82,7 @@ get_servers_leader_preferred(DB, Shard) ->
[Leader | lists:delete(Leader, Servers)]; [Leader | lists:delete(Leader, Servers)];
undefined -> undefined ->
%% TODO: Dynamic membership. %% TODO: Dynamic membership.
get_shard_servers(DB, Shard) get_online_servers(DB, Shard)
end. end.
get_server_local_preferred(DB, Shard) -> get_server_local_preferred(DB, Shard) ->
@ -97,9 +97,27 @@ get_server_local_preferred(DB, Shard) ->
%% Leader is unkonwn if there are no servers of this group on the %% Leader is unkonwn if there are no servers of this group on the
%% local node. We want to pick a replica in that case as well. %% local node. We want to pick a replica in that case as well.
%% TODO: Dynamic membership. %% TODO: Dynamic membership.
pick_random(get_shard_servers(DB, Shard)) pick_random(get_online_servers(DB, Shard))
end. end.
get_online_servers(DB, Shard) ->
filter_online(get_shard_servers(DB, Shard)).
filter_online(Servers) ->
case lists:filter(fun is_server_online/1, Servers) of
[] ->
%% FIXME
Servers;
Online ->
Online
end.
is_server_online({_Name, Node}) ->
is_node_online(Node).
is_node_online(Node) ->
Node == node() orelse lists:member(Node, nodes()).
pick_local(Servers) -> pick_local(Servers) ->
case lists:dropwhile(fun({_Name, Node}) -> Node =/= node() end, Servers) of case lists:dropwhile(fun({_Name, Node}) -> Node =/= node() end, Servers) of
[Local | _] -> [Local | _] ->