@@ -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 } )
165185end
0 commit comments