bitwalker / bitwalker/swarm

Violation of the Swarm.Distribution.Strategy definition is actually accepted

Open
#140 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Elixir
Stars
1.3k
Forks
110
PR merge metrics
No merged PRs in 30d

Description

https://github.com/bitwalker/swarm/blob/4aee63d83ad5ee6ee095b38b3ff93a4dbb7c3400/lib/swarm/tracker/tracker.ex#L1187

By definition, `Swarm.Distribution.Strategy.key_to_node/2` can return `node() | :undefined`. However this exact line is actually accepting `{:error, {:invalid_ring, :no_nodes}}` as a valid return value, which is actually what `HashRing.key_to_node/2` returns in case of error.

So `Swarm.Distribution.Ring.key_to_node/2` should actually return `:undefined` instead of `{:error, reason}` to honour the strategy definition:

```
defmodule Swarm.Distribution.Ring do
...
def key_to_node(ring, key) do
case HashRing.key_to_node(ring, key) do
{:error, _reason} -> :undefined
node -> node
end
end
end
```

Contributor guide

No contributing guide indexed for this repository

Research direction

Start in lib/swarm/tracker/tracker.ex at line 1187 and inspect the Swarm.Distribution.Strategy.key_to_node/2 contract alongside Swarm.Distribution.Ring.key_to_node/2. Check the HashRing.key_to_node/2 error result, and consider the issue complete when Ring.key_to_node/2 returns :undefined for that error while preserving valid node results.

Written by the indexing model from the issue text.

Assessment

Tech stack
elixir
Domain
distributed-systems
Issue type
Bug
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Stale
Clarity
Clearly specified
Newbie friendliness
55/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.