Skip to content
File

Blob: chord/local_trace_test.go

go43 lines
1package chord
2 
3import (
4 "strconv"
5 "strings"
6 
7 "go.miragespace.co/specter/spec/chord"
8)
9 
10func (n *LocalNode) ringTrace() string {
11 var sb strings.Builder
12 sb.WriteString(strconv.FormatUint(n.ID(), 10))
13 
14 var err error
15 var next chord.VNode = n
16 seen := make(map[uint64]bool)
17 
18 for {
19 next, err = n.FindSuccessor(chord.ModuloSum(next.ID(), 1))
20 if err != nil {
21 sb.WriteString(" -> ")
22 sb.WriteString("error")
23 break
24 }
25 if next == nil {
26 break
27 }
28 if next.ID() == n.ID() {
29 sb.WriteString(" -> ")
30 sb.WriteString(strconv.FormatUint(n.ID(), 10))
31 break
32 }
33 if seen[next.ID()] {
34 return "unstable"
35 }
36 sb.WriteString(" -> ")
37 sb.WriteString(strconv.FormatUint(next.ID(), 10))
38 seen[next.ID()] = true
39 }
40 
41 return sb.String()
42}