Packages
horde
0.8.5
0.10.0
0.9.1
0.9.0
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.8.0-rc.1
0.7.1
0.7.0
0.6.1
0.6.0
0.6.0-rc.1
0.5.0
0.5.0-rc.12
0.5.0-rc.11
0.5.0-rc.10
0.5.0-rc.9
0.5.0-rc.8
0.5.0-rc.7
0.5.0-rc.6
0.5.0-rc.5
0.5.0-rc.4
0.5.0-rc.3
0.5.0-rc.2
0.5.0-rc.1
0.4.0-rc.2
0.4.0-rc.1
0.3.0
0.3.0-rc1
0.2.3
0.2.2
0.2.1
0.2.0
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
Distributed supervisor & process registry built with DELTA-CRDTs
Current section
Files
Jump to
Current section
Files
lib/horde/uniform_distribution.ex
defmodule Horde.UniformDistribution do
@behaviour Horde.DistributionStrategy
@moduledoc """
Distributes processes to nodes uniformly using a hash ring
"""
def choose_node(identifier, members) do
members
|> Enum.filter(&match?(%{status: :alive}, &1))
|> Map.new(fn member -> {member.name, member} end)
|> case do
members when map_size(members) == 0 ->
{:error, :no_alive_nodes}
members ->
chosen_member =
HashRing.new()
|> HashRing.add_nodes(Map.keys(members))
|> HashRing.key_to_node(identifier)
{:ok, Map.get(members, chosen_member)}
end
end
def has_quorum?(_members), do: true
end