Skip to content

Commit 10615d5

Browse files
committed
Disallow empty skeleton
1 parent 793debe commit 10615d5

4 files changed

Lines changed: 39 additions & 28 deletions

File tree

benches/hrw.exs

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,25 @@
1-
nodes_tiny = Enum.map(1..10, fn i -> "key-#{i}" end)
2-
nodes_small = Enum.map(1..100, fn i -> "key-#{i}" end)
3-
nodes_medium = Enum.map(1..1000, fn i -> "key-#{i}" end)
4-
nodes_large = Enum.map(1..10000, fn i -> "key-#{i}" end)
1+
Mix.install([
2+
{:hrw, path: Path.expand("..", __DIR__)},
3+
{:benchee, "~> 1.5"},
4+
{:ex_hash_ring, "~> 7.0"}
5+
])
6+
7+
alias ExHashRing.Ring
8+
9+
setup = fn n ->
10+
nodes = Enum.map(1..n, &"node-#{&1}")
11+
{:ok, ring} = Ring.start_link()
12+
Ring.set_nodes(ring, nodes, :infinity)
13+
%{nodes: nodes, skeleton: HRW.Skeleton.build(nodes), ring: ring}
14+
end
515

616
Benchee.run(%{
7-
"owner" => fn %{nodes: nodes} -> HRW.owner("test", nodes) end,
8-
"skeleton pre-built" => fn %{skeleton: skeleton} -> HRW.Skeleton.owner("test", skeleton) end,
9-
"skeleton every" => fn %{nodes: nodes} -> skeleton = HRW.Skeleton.build(nodes); HRW.Skeleton.owner("test", skeleton) end
17+
"HRW.owner" => fn %{nodes: nodes} -> HRW.owner("test", nodes) end,
18+
"HRW.Skeleton.owner" => fn %{skeleton: skeleton} -> HRW.Skeleton.owner("test", skeleton) end,
19+
"ExHashRing.Ring.find_node" => fn %{ring: ring} -> Ring.find_node(ring, "test") end
1020
}, inputs: %{
11-
"tiny" => %{
12-
nodes: nodes_tiny,
13-
skeleton: HRW.Skeleton.build(nodes_tiny)
14-
},
15-
"small" => %{
16-
nodes: nodes_small,
17-
skeleton: HRW.Skeleton.build(nodes_small)
18-
},
19-
"medium" => %{
20-
nodes: nodes_medium,
21-
skeleton: HRW.Skeleton.build(nodes_medium)
22-
},
23-
"large" => %{
24-
nodes: nodes_large,
25-
skeleton: HRW.Skeleton.build(nodes_large)
26-
},
21+
"tiny" => setup.(10),
22+
"small" => setup.(100),
23+
"medium" => setup.(1_000),
24+
"large" => setup.(10_000),
2725
})

lib/hrw.ex

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ defmodule HRW do
2323
"server2"
2424
2525
"""
26+
@spec owner(term(), [term()], keyword()) :: term()
2627
def owner(key, nodes, opts \\ []) do
2728
hash_fn = Keyword.get(opts, :hash_fn, &:erlang.phash2/1)
2829

@@ -44,6 +45,7 @@ defmodule HRW do
4445
["server2", "server3"]
4546
4647
"""
48+
@spec owners(term(), [term()], non_neg_integer(), keyword()) :: [term()]
4749
def owners(key, nodes, count, opts \\ []) do
4850
hash_fn = Keyword.get(opts, :hash_fn, &:erlang.phash2/1)
4951

lib/hrw/skeleton.ex

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ defmodule HRW.Skeleton do
99

1010
defstruct [:clusters, :fanout, :levels]
1111

12+
@type t :: %__MODULE__{
13+
clusters: tuple(),
14+
fanout: pos_integer(),
15+
levels: non_neg_integer()
16+
}
17+
1218
@doc """
1319
Builds a skeleton from `nodes`.
1420
@@ -23,7 +29,14 @@ defmodule HRW.Skeleton do
2329
#HRW.Skeleton<3 nodes, fanout: 3>
2430
2531
"""
26-
def build(nodes, opts \\ []) do
32+
@spec build([term()], keyword()) :: t()
33+
def build(nodes, opts \\ [])
34+
35+
def build([], _opts) do
36+
raise ArgumentError, "HRW.Skeleton.build/2 requires a non-empty list of nodes"
37+
end
38+
39+
def build(nodes, opts) do
2740
fanout = Keyword.get(opts, :fanout, 3)
2841
size = Keyword.get(opts, :cluster_size, 16)
2942

@@ -53,13 +66,12 @@ defmodule HRW.Skeleton do
5366
"server3"
5467
5568
"""
69+
@spec owner(term(), t(), keyword()) :: term()
5670
def owner(key, %__MODULE__{} = skeleton, opts \\ []) do
5771
hash_fn = Keyword.get(opts, :hash_fn, &:erlang.phash2/1)
5872
do_owner(key, skeleton, 0, hash_fn)
5973
end
6074

61-
defp do_owner(_key, %__MODULE__{clusters: {}}, _salt, _hash_fn), do: nil
62-
6375
defp do_owner(key, %__MODULE__{clusters: {cluster}}, _salt, hash_fn) do
6476
Enum.max_by(cluster, fn node -> hash_fn.({key, node}) end)
6577
end

mix.exs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@ defmodule HRW.MixProject do
2222
defp deps do
2323
[
2424
{:ex_doc, "~> 0.40.1", only: :dev},
25-
{:credo, "~> 1.7", only: :dev},
26-
{:benchee, "~> 1.5", only: :dev}
25+
{:credo, "~> 1.7", only: :dev}
2726
]
2827
end
2928
end

0 commit comments

Comments
 (0)