Fix config_diff panics when old config or new config is empty

Fixes #190
This commit is contained in:
Miao Wang 2023-04-18 20:31:50 +08:00
parent c3b742c2a8
commit 45099fc7d3

View File

@ -53,34 +53,43 @@ func diffMirrorConfig(oldList, newList []mirrorConfig) []mirrorCfgTrans {
sort.Sort(sortableMirrorList(oList)) sort.Sort(sortableMirrorList(oList))
sort.Sort(sortableMirrorList(nList)) sort.Sort(sortableMirrorList(nList))
// insert a tail node to both lists if len(oList) != 0 && len(nList) != 0 {
// as the maximum node // insert a tail node to both lists
lastOld, lastNew := oList[len(oList)-1], nList[len(nList)-1] // as the maximum node
maxName := lastOld.Name lastOld, lastNew := oList[len(oList)-1], nList[len(nList)-1]
if lastNew.Name > lastOld.Name { maxName := lastOld.Name
maxName = lastNew.Name if lastNew.Name > lastOld.Name {
} maxName = lastNew.Name
Nil := mirrorConfig{Name: "~" + maxName} }
if Nil.Name <= maxName { Nil := mirrorConfig{Name: "~" + maxName}
panic("Nil.Name should be larger than maxName") if Nil.Name <= maxName {
} panic("Nil.Name should be larger than maxName")
oList, nList = append(oList, Nil), append(nList, Nil) }
oList, nList = append(oList, Nil), append(nList, Nil)
// iterate over both lists to find the difference // iterate over both lists to find the difference
for i, j := 0, 0; i < len(oList) && j < len(nList); { for i, j := 0, 0; i < len(oList) && j < len(nList); {
o, n := oList[i], nList[j] o, n := oList[i], nList[j]
if n.Name < o.Name { if n.Name < o.Name {
operations = append(operations, mirrorCfgTrans{diffAdd, n}) operations = append(operations, mirrorCfgTrans{diffAdd, n})
j++ j++
} else if o.Name < n.Name { } else if o.Name < n.Name {
operations = append(operations, mirrorCfgTrans{diffDelete, o}) operations = append(operations, mirrorCfgTrans{diffDelete, o})
i++ i++
} else { } else {
if !reflect.DeepEqual(o, n) { if !reflect.DeepEqual(o, n) {
operations = append(operations, mirrorCfgTrans{diffModify, n}) operations = append(operations, mirrorCfgTrans{diffModify, n})
}
i++
j++
} }
i++ }
j++ } else {
for i := 0; i < len(oList); i++ {
operations = append(operations, mirrorCfgTrans{diffDelete, oList[i]})
}
for i := 0; i < len(nList); i++ {
operations = append(operations, mirrorCfgTrans{diffAdd, nList[i]})
} }
} }