ec distribution: register each node id once

Adding the same node twice appended it to RackToNodes twice, so every
count that walks rack nodes double-counted its shards.
This commit is contained in:
Devin
2026-10-21 14:29:49 -07:00
parent 5482696a20
commit f3fcf9a06e
2 changed files with 16 additions and 1 deletions
@@ -16,8 +16,11 @@ func NewTopologyAnalysis() *TopologyAnalysis {
}
// AddNode registers a node in the topology, including any shards it already
// holds for the volume being analyzed.
// holds for the volume being analyzed. A node id may only register once.
func (a *TopologyAnalysis) AddNode(node *TopologyNode) {
if _, ok := a.AllNodes[node.NodeID]; ok {
return
}
a.AllNodes[node.NodeID] = node
a.RackToNodes[rackKey(node.DataCenter, node.Rack)] = append(a.RackToNodes[rackKey(node.DataCenter, node.Rack)], node)
if !contains(a.DCToRacks[node.DataCenter], node.Rack) {
@@ -125,6 +125,18 @@ func TestTopologyAnalysis(t *testing.T) {
assert.Equal(t, []int{0, 1, 2}, a.RackToShards[rackKey("dc1", "r1")])
}
// A node registered twice must still count once in rack and shard totals.
func TestTopologyAnalysisDuplicateNode(t *testing.T) {
a := NewTopologyAnalysis()
a.AddNode(makeNode("n1", "dc1", "r1", 5, 0, 1))
a.AddNode(makeNode("n1", "dc1", "r1", 5, 0, 1))
a.Finalize()
assert.Equal(t, 1, a.TotalNodes)
assert.Len(t, a.RackToNodes[rackKey("dc1", "r1")], 1)
assert.Equal(t, 2, a.ShardsByNode["n1"])
}
// Shards may be registered either through TopologyNode.ShardIDs or through
// AddShardLocation — both must leave the node holding the shards.
func TestTopologyAnalysisAddShardLocation(t *testing.T) {