فهرست منبع

etcdserver: better warning when initial-cluster doesn't match advertise urls

The old error was not clear about what URLs needed to be added, sometimes
truncating the list. To make it clearer, print out the missing entries
for --initial-cluster and print the full list of initial advertise peers.

Fixes #8079 and #7927
Anthony Romano 8 سال پیش
والد
کامیت
7ff5b05004
2فایلهای تغییر یافته به همراه42 افزوده شده و 4 حذف شده
  1. 34 4
      etcdserver/config.go
  2. 8 0
      etcdserver/config_test.go

+ 34 - 4
etcdserver/config.go

@@ -117,11 +117,41 @@ func (c *ServerConfig) advertiseMatchesCluster() error {
 	sort.Strings(apurls)
 	sort.Strings(apurls)
 	ctx, cancel := context.WithTimeout(context.TODO(), 30*time.Second)
 	ctx, cancel := context.WithTimeout(context.TODO(), 30*time.Second)
 	defer cancel()
 	defer cancel()
-	if !netutil.URLStringsEqual(ctx, apurls, urls.StringSlice()) {
-		umap := map[string]types.URLs{c.Name: c.PeerURLs}
-		return fmt.Errorf("--initial-cluster must include %s given --initial-advertise-peer-urls=%s", types.URLsMap(umap).String(), strings.Join(apurls, ","))
+	if netutil.URLStringsEqual(ctx, apurls, urls.StringSlice()) {
+		return nil
 	}
 	}
-	return nil
+
+	initMap, apMap := make(map[string]struct{}), make(map[string]struct{})
+	for _, url := range c.PeerURLs {
+		apMap[url.String()] = struct{}{}
+	}
+	for _, url := range c.InitialPeerURLsMap[c.Name] {
+		initMap[url.String()] = struct{}{}
+	}
+
+	missing := []string{}
+	for url := range initMap {
+		if _, ok := apMap[url]; !ok {
+			missing = append(missing, url)
+		}
+	}
+	if len(missing) > 0 {
+		for i := range missing {
+			missing[i] = c.Name + "=" + missing[i]
+		}
+		mstr := strings.Join(missing, ",")
+		apStr := strings.Join(apurls, ",")
+		return fmt.Errorf("--initial-cluster has %s but missing from --initial-advertise-peer-urls=%s ", mstr, apStr)
+	}
+
+	for url := range apMap {
+		if _, ok := initMap[url]; !ok {
+			missing = append(missing, url)
+		}
+	}
+	mstr := strings.Join(missing, ",")
+	umap := types.URLsMap(map[string]types.URLs{c.Name: c.PeerURLs})
+	return fmt.Errorf("--initial-advertise-peer-urls has %s but missing from --initial-cluster=%s", mstr, umap.String())
 }
 }
 
 
 func (c *ServerConfig) MemberDir() string { return filepath.Join(c.DataDir, "member") }
 func (c *ServerConfig) MemberDir() string { return filepath.Join(c.DataDir, "member") }

+ 8 - 0
etcdserver/config_test.go

@@ -107,6 +107,14 @@ func TestConfigVerifyLocalMember(t *testing.T) {
 
 
 			true,
 			true,
 		},
 		},
+		{
+			// Advertised peer URLs must match those in cluster-state
+			"node1=http://localhost:12345",
+			[]string{"http://localhost:2380", "http://localhost:12345"},
+			true,
+
+			true,
+		},
 		{
 		{
 			// Advertised peer URLs must match those in cluster-state
 			// Advertised peer URLs must match those in cluster-state
 			"node1=http://localhost:2380",
 			"node1=http://localhost:2380",