Skip to content

Commit 8dfff68

Browse files
MikaAKbitwalker
authored andcommitted
fix: add key_to_nodes to managed_ring and worker
1 parent 7bc38c9 commit 8dfff68

File tree

2 files changed

+35
-2
lines changed

2 files changed

+35
-2
lines changed

lib/managed_ring.ex

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,4 +282,17 @@ defmodule HashRing.Managed do
282282
def key_to_node(ring, key) do
283283
HashRing.Worker.key_to_node(ring, key)
284284
end
285+
286+
@doc """
287+
Maps a key to a set of nodes on the hash ring.
288+
289+
An error is returned if the ring does not exist.
290+
"""
291+
@spec key_to_nodes(ring, any(), pos_integer) ::
292+
[key]
293+
| {:error, :no_such_ring}
294+
| {:error, {:invalid_ring, :no_nodes}}
295+
def key_to_nodes(ring, key, count) do
296+
HashRing.Worker.key_to_nodes(ring, key, count)
297+
end
285298
end

lib/worker.ex

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ defmodule HashRing.Worker do
1414
|> get_ring()
1515
|> HashRing.nodes()
1616
rescue
17-
ArgumentError ->
17+
ArgumentError ->
1818
{:error, :no_such_ring}
1919
end
2020

@@ -39,6 +39,22 @@ defmodule HashRing.Worker do
3939
{:error, :no_such_ring}
4040
end
4141

42+
def key_to_nodes(pid_or_name, key, count)
43+
44+
def key_to_nodes(pid, key, count) when is_pid(pid) do
45+
do_call(pid, {:key_to_nodes, key, count})
46+
end
47+
48+
def key_to_nodes(name, key, count) when is_atom(name) do
49+
name
50+
|> get_ets_name()
51+
|> get_ring()
52+
|> HashRing.key_to_nodes(key, count)
53+
rescue
54+
ArgumentError ->
55+
{:error, :no_such_ring}
56+
end
57+
4258
def delete(name), do: do_call(name, :delete)
4359

4460
## Server
@@ -102,6 +118,10 @@ defmodule HashRing.Worker do
102118
{:reply, HashRing.key_to_node(get_ring(table), key), state}
103119
end
104120

121+
def handle_call({:key_to_nodes, key, count}, _from, {table, _b, _w} = state) do
122+
{:reply, HashRing.key_to_nodes(get_ring(table), key, count), state}
123+
end
124+
105125
def handle_call({:add_node, node}, _from, {table, _b, _w} = state) do
106126
get_ring(table) |> HashRing.add_node(node) |> update_ring(table)
107127
{:reply, :ok, state}
@@ -160,6 +180,6 @@ defmodule HashRing.Worker do
160180

161181
defp get_ring(table), do: :ets.lookup_element(table, :ring, 2)
162182

163-
defp update_ring(ring, table),
183+
defp update_ring(ring, table),
164184
do: :ets.update_element(table, :ring, {2, ring})
165185
end

0 commit comments

Comments
 (0)