@@ -246,27 +246,32 @@ defmodule HashRing do
246246
247247 case :gb_trees . iterator_from ( hash , r ) |> :gb_trees . next ( ) do
248248 { _key , node , iter } ->
249- find_nodes_from_iter ( iter , count - 1 , [ node ] )
249+ find_nodes_from_iter ( r , iter , count - 1 , [ node ] , _restarted? = false )
250250
251251 _ ->
252252 { _key , node } = :gb_trees . smallest ( r )
253253 [ node ]
254254 end
255255 end
256256
257- defp find_nodes_from_iter ( _iter , 0 , results ) , do: Enum . reverse ( results )
257+ defp find_nodes_from_iter ( _ring , _iter , 0 , results , _restared? ) , do: Enum . reverse ( results )
258258
259- defp find_nodes_from_iter ( iter , count , results ) do
259+ defp find_nodes_from_iter ( ring , iter , count , results , restarted? ) do
260260 case :gb_trees . next ( iter ) do
261261 { _key , node , iter } ->
262262 if node in results do
263- find_nodes_from_iter ( iter , count , results )
263+ find_nodes_from_iter ( ring , iter , count , results , restarted? )
264264 else
265- find_nodes_from_iter ( iter , count - 1 , [ node | results ] )
265+ find_nodes_from_iter ( ring , iter , count - 1 , [ node | results ] , restarted? )
266266 end
267267
268- _ ->
269- results
268+ :none ->
269+ if restarted? do
270+ Enum . reverse ( results )
271+ else
272+ restart_iter = :gb_trees . iterator ( ring )
273+ find_nodes_from_iter ( ring , restart_iter , count , results , _restarted? = true )
274+ end
270275 end
271276 end
272277end
0 commit comments