Skip to content

Commit

Permalink
etcdserver: better warning when initial-cluster doesn't match adverti…
Browse files Browse the repository at this point in the history
…se 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
  • Loading branch information
heyitsanthony committed Jun 12, 2017
1 parent 933aa09 commit c3a9162
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 4 deletions.
32 changes: 28 additions & 4 deletions etcdserver/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -117,11 +117,35 @@ func (c *ServerConfig) advertiseMatchesCluster() error {
sort.Strings(apurls)
ctx, cancel := context.WithTimeout(context.TODO(), 30*time.Second)
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)
}
}

apStr := strings.Join(apurls, ",")
if len(missing) > 0 {
for i := range missing {
missing[i] = c.Name + "=" + missing[i]
}
mstr := strings.Join(missing, ",")
return fmt.Errorf("--initial-cluster has %s but missing from --initial-advertise-peer-urls=%s ", mstr, apStr)
}
umap := types.URLsMap(map[string]types.URLs{c.Name: c.PeerURLs})
return fmt.Errorf("--initial-advertise-peer-urls=%s but missing from --initial-cluster=%s", apStr, umap.String())
}

func (c *ServerConfig) MemberDir() string { return filepath.Join(c.DataDir, "member") }
Expand Down
8 changes: 8 additions & 0 deletions etcdserver/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,14 @@ func TestConfigVerifyLocalMember(t *testing.T) {

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
"node1=http://localhost:2380",
Expand Down

0 comments on commit c3a9162

Please sign in to comment.