diff --git a/ipam/ring/ring.go b/ipam/ring/ring.go index 1f2c7790..a582540e 100644 --- a/ipam/ring/ring.go +++ b/ipam/ring/ring.go @@ -356,12 +356,7 @@ func (r *Ring) ClaimForPeers(peers []mesh.PeerName) { } } - if e, found := r.Entries.get(pos); found { - e.update(peer, share) - } else { - r.Entries.insert(entry{Token: pos, Peer: peer, Free: share}) - } - + r.Entries.insert(entry{Token: pos, Peer: peer, Free: share}) pos += address.Address(share) } diff --git a/ipam/ring/ring_test.go b/ipam/ring/ring_test.go index b36a0333..a7b27f84 100644 --- a/ipam/ring/ring_test.go +++ b/ipam/ring/ring_test.go @@ -60,13 +60,19 @@ func TestInsert(t *testing.T) { ring.Entries.entry(0).Free = 0 ring.Entries.insert(entry{Token: dot245, Peer: peer1name}) - ring2 := New(start, end, peer1name) - ring2.Entries = []*entry{{Token: start, Peer: peer1name, Free: 0}, {Token: dot245, Peer: peer1name}} - require.Equal(t, ring2, ring) + check := []RangeInfo{ + {Peer: peer1name, Range: address.Range{Start: start, End: dot245}}, + {Peer: peer1name, Range: address.Range{Start: dot245, End: end}}, + } + require.Equal(t, check, ring.AllRangeInfo()) ring.Entries.insert(entry{Token: dot10, Peer: peer1name}) - ring2.Entries = []*entry{{Token: start, Peer: peer1name, Free: 0}, {Token: dot10, Peer: peer1name}, {Token: dot245, Peer: peer1name}} - require.Equal(t, ring2, ring) + check2 := []RangeInfo{ + {Peer: peer1name, Range: address.Range{Start: start, End: dot10}}, + {Peer: peer1name, Range: address.Range{Start: dot10, End: dot245}}, + {Peer: peer1name, Range: address.Range{Start: dot245, End: end}}, + } + require.Equal(t, check2, ring.AllRangeInfo()) } func TestBetween(t *testing.T) { @@ -506,6 +512,29 @@ func TestOwner(t *testing.T) { } +func makePeerName(i int) mesh.PeerName { + if i >= 10000 { + panic("makePeerName: invalid value") + } + peer, _ := mesh.PeerNameFromString(fmt.Sprintf("%02d:%02d:00:00:00:ff", i/100, i%100)) + return peer +} + +func TestClaimForPeers(t *testing.T) { + const numPeers = 12 + // Different end to usual so we get a number of addresses that a) + // is smaller than the max number of peers, and b) is divisible by + // some number of peers. This maximises coverage of edge cases. + end := dot10 + peers := make([]mesh.PeerName, numPeers) + // Test for a range of peer counts + for i := 0; i < numPeers; i++ { + peers[i] = makePeerName(i) + ring := New(start, end, peers[0]) + ring.ClaimForPeers(peers[:i+1]) + } +} + type addressSlice []address.Address func (s addressSlice) Len() int { return len(s) } @@ -520,8 +549,7 @@ func TestFuzzRing(t *testing.T) { peers := make([]mesh.PeerName, numPeers) for i := 0; i < numPeers; i++ { - peer, _ := mesh.PeerNameFromString(fmt.Sprintf("%02d:00:00:00:02:00", i)) - peers[i] = peer + peers[i] = makePeerName(i) } // Make a valid, random ring @@ -608,7 +636,7 @@ func TestFuzzRingHard(t *testing.T) { ) addPeer := func() { - peer, _ := mesh.PeerNameFromString(fmt.Sprintf("%02d:%02d:00:00:00:00", nextPeerID/10, nextPeerID%10)) + peer := makePeerName(nextPeerID) common.Log.Debugf("%s: Adding peer", peer) nextPeerID++ peers = append(peers, peer)