浏览代码

Fix config_diff panics when old config or new config is empty

Fixes #190
Miao Wang 2 年之前
父节点
当前提交
45099fc7d3
共有 1 个文件被更改,包括 35 次插入26 次删除
  1. 35 26
      worker/config_diff.go

+ 35 - 26
worker/config_diff.go

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