Skip to content
This repository was archived by the owner on Jun 20, 2024. It is now read-only.

Commit 6d1e33b

Browse files
committed
Merge pull request #1957 from /issues/1949-ring-errors
Make error messages on ring merge clearer
2 parents ed3c50f + 034da37 commit 6d1e33b

File tree

2 files changed

+18
-11
lines changed

2 files changed

+18
-11
lines changed

ipam/ring/ring.go

+14-8
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,19 @@ var (
4040
ErrTokenOutOfRange = errors.New("Token is out of range")
4141
ErrDifferentSeeds = errors.New("Received ring was seeded differently from ours!")
4242
ErrDifferentRange = errors.New("Received range differs from ours!")
43-
ErrNewerVersion = errors.New("Received new version for entry I own!")
44-
ErrInvalidEntry = errors.New("Received invalid state update!")
45-
ErrEntryInMyRange = errors.New("Received new entry in my range!")
4643
ErrNotFound = errors.New("No entries for peer found")
4744
)
4845

46+
func errInconsistentEntry(mine, theirs *entry) error {
47+
return fmt.Errorf("Inconsistent entries for %s: owned by %s but incoming message says %s", mine.Token, mine.Peer, theirs.Peer)
48+
}
49+
func errEntryInMyRange(theirs *entry) error {
50+
return fmt.Errorf("Peer %s says it owns the IP range from %s, which I think I own", theirs.Peer, theirs.Token)
51+
}
52+
func errNewerVersion(mine, theirs *entry) error {
53+
return fmt.Errorf("Received update for IP range I own at %s v%d: incoming message says owner %s v%d", mine.Token, mine.Version, theirs.Peer, theirs.Version)
54+
}
55+
4956
func (r *Ring) checkInvariants() error {
5057
if !sort.IsSorted(r.Entries) {
5158
return ErrNotSorted
@@ -224,7 +231,7 @@ func (r *Ring) Merge(gossip Ring) error {
224231
case mine.Token > theirs.Token:
225232
// insert, checking that a range owned by us hasn't been split
226233
if previousOwner != nil && *previousOwner == r.Peer && theirs.Peer != r.Peer {
227-
return ErrEntryInMyRange
234+
return errEntryInMyRange(theirs)
228235
}
229236
addToResult(*theirs)
230237
previousOwner = nil
@@ -234,14 +241,13 @@ func (r *Ring) Merge(gossip Ring) error {
234241
switch {
235242
case mine.Version >= theirs.Version:
236243
if mine.Version == theirs.Version && !mine.Equal(theirs) {
237-
common.Log.Debugf("Error merging entries at %s - %v != %v", mine.Token, mine, theirs)
238-
return ErrInvalidEntry
244+
return errInconsistentEntry(mine, theirs)
239245
}
240246
addToResult(*mine)
241247
previousOwner = &mine.Peer
242248
case mine.Version < theirs.Version:
243249
if mine.Peer == r.Peer { // We shouldn't receive updates to our own tokens
244-
return ErrNewerVersion
250+
return errNewerVersion(mine, theirs)
245251
}
246252
addToResult(*theirs)
247253
previousOwner = nil
@@ -262,7 +268,7 @@ func (r *Ring) Merge(gossip Ring) error {
262268
for ; j < len(gossip.Entries); j++ {
263269
theirs = gossip.Entries[j]
264270
if previousOwner != nil && *previousOwner == r.Peer && theirs.Peer != r.Peer {
265-
return ErrEntryInMyRange
271+
return errEntryInMyRange(theirs)
266272
}
267273
addToResult(*theirs)
268274
previousOwner = nil

ipam/ring/ring_test.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -225,17 +225,18 @@ func TestMergeErrors(t *testing.T) {
225225
ring2 = New(start, end, peer2name)
226226
ring1.Entries = []*entry{{Token: start, Peer: peer1name}}
227227
ring2.Entries = []*entry{{Token: start, Peer: peer1name, Version: 1}}
228-
require.True(t, ring1.Merge(*ring2) == ErrNewerVersion, "Expected ErrNewerVersion")
228+
fmt.Println(ring1.Merge(*ring2))
229+
require.Error(t, ring1.Merge(*ring2), "Expected error")
229230

230231
// Cannot Merge two entries with same version but different hosts
231232
ring1.Entries = []*entry{{Token: start, Peer: peer1name}}
232233
ring2.Entries = []*entry{{Token: start, Peer: peer2name}}
233-
require.True(t, ring1.Merge(*ring2) == ErrInvalidEntry, "Expected ErrInvalidEntry")
234+
require.Error(t, ring1.Merge(*ring2), "Expected error")
234235

235236
// Cannot Merge an entry into a range I own
236237
ring1.Entries = []*entry{{Token: start, Peer: peer1name}}
237238
ring2.Entries = []*entry{{Token: middle, Peer: peer2name}}
238-
require.True(t, ring1.Merge(*ring2) == ErrEntryInMyRange, "Expected ErrEntryInMyRange")
239+
require.Error(t, ring1.Merge(*ring2), "Expected error")
239240
}
240241

241242
func TestMergeMore(t *testing.T) {

0 commit comments

Comments
 (0)