panic: expected 'node_7' to be gone! membership after SingleUpdateClusterMemberConfig; memlistAfterRemove = 'memMap of len(8):
node_6
node_5
node_1
node_0
node_4
node_3
node_7
node_2
'; nodes[7].PeerID = 'oXs3x5peQ2EOt1esGrOM0axFQO2x'
However, the string that generated that list TRIED TO SORT IT. That code looks like this:
_, present := memlistAfterRemove[nodes[i].PeerID]
if present {
panic(fmt.Sprintf("expected '%v' to be gone! membership after SingleUpdateClusterMemberConfig; memlistAfterRemove = '%v'; nodes[%v].PeerID = '%v'", namei, memlistAfterRemove, i, nodes[i].PeerID))
}
and the sorting code is exactly the String() code shown in the playgound link above ( https://go.dev/play/p/_GpoXKp9kER )
The mystery is: why didn't the node list come out sorted?
Any thoughts?
Thanks!
- Jason
code in case playground not available:
package main
import (
"cmp"
"fmt"
"iter"
"slices"
)
// sort any map by its keys
func sorted[K cmp.Ordered, V any](m map[K]V) iter.Seq2[K, V] {
return func(yield func(K, V) bool) {
var keys []K
for k := range m {
keys = append(keys, k)
}
slices.Sort(keys)
for _, k := range keys {
v := m[k]
if !yield(k, v) {
return
}
}
} // end seq2 definition
}
type memMap map[string]string
func (m memMap) String() (r string) {
r = fmt.Sprintf("memMap of len(%v):\n", len(m))
for key := range sorted(m) {
r += fmt.Sprintf(" %v\n", key)
}
return
}
func main() {
m := make(memMap)
m["node_2"] = "2"
m["node_1"] = "1"
m["node_0"] = "0"
m["node_9"] = "9"
fmt.Printf("%v\n", m)
fmt.Printf("%v\n", m)
fmt.Printf("%v\n", m)
}