Skip to content

Commit 108adea

Browse files
committed
fix: following fixes issue mentioned here bitwalker#40.
1 parent c64f12d commit 108adea

File tree

2 files changed

+21
-7
lines changed

2 files changed

+21
-7
lines changed

lib/ring.ex

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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
272277
end

test/hashring_test.exs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,15 @@ defmodule HashRingTest do
1919
assert length(nodes) == 2
2020
end
2121

22+
test "key_to_nodes/3 test 14" do
23+
ring =
24+
HashRing.new()
25+
|> HashRing.add_node(:a@localhost)
26+
|> HashRing.add_node(:b@localhost)
27+
28+
assert HashRing.key_to_nodes(ring, 14, 2) == [:a@localhost, :b@localhost]
29+
end
30+
2231
property "adding one node leaves us with a tree with one node" do
2332
check all(name <- string(:printable, min_length: 1)) do
2433
%HashRing{nodes: nodes} = HashRing.new(name)

0 commit comments

Comments
 (0)