wip(dsrepl): avoid contacting offline nodes prematurely
This commit is contained in:
parent
0b69c8b7f3
commit
c6085a6ab0
|
@ -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 | _] ->
|
||||||
|
|
Loading…
Reference in New Issue