Browse Source

Merge pull request #2304 from xiang90/fix_discovery_validation

etcdserver: validate discovery cluster
Xiang Li 11 years ago
parent
commit
f7998bb2db
3 changed files with 19 additions and 9 deletions
  1. 14 0
      etcdserver/cluster.go
  2. 2 9
      etcdserver/config.go
  3. 3 0
      etcdserver/server.go

+ 14 - 0
etcdserver/cluster.go

@@ -346,6 +346,20 @@ func (c *Cluster) UpdateRaftAttributes(id types.ID, raftAttr RaftAttributes) {
 	c.members[id].RaftAttributes = raftAttr
 	c.members[id].RaftAttributes = raftAttr
 }
 }
 
 
+// Validate ensures that there is no identical urls in the cluster peer list
+func (c *Cluster) Validate() error {
+	urlMap := make(map[string]bool)
+	for _, m := range c.Members() {
+		for _, url := range m.PeerURLs {
+			if urlMap[url] {
+				return fmt.Errorf("duplicate url %v in cluster config", url)
+			}
+			urlMap[url] = true
+		}
+	}
+	return nil
+}
+
 func membersFromStore(st store.Store) (map[types.ID]*Member, map[types.ID]bool) {
 func membersFromStore(st store.Store) (map[types.ID]*Member, map[types.ID]bool) {
 	members := make(map[types.ID]*Member)
 	members := make(map[types.ID]*Member)
 	removed := make(map[types.ID]bool)
 	removed := make(map[types.ID]bool)

+ 2 - 9
etcdserver/config.go

@@ -62,15 +62,8 @@ func (c *ServerConfig) VerifyBootstrapConfig() error {
 		return fmt.Errorf("initial cluster state unset and no wal or discovery URL found")
 		return fmt.Errorf("initial cluster state unset and no wal or discovery URL found")
 	}
 	}
 
 
-	// No identical IPs in the cluster peer list
-	urlMap := make(map[string]bool)
-	for _, m := range c.Cluster.Members() {
-		for _, url := range m.PeerURLs {
-			if urlMap[url] {
-				return fmt.Errorf("duplicate url %v in cluster config", url)
-			}
-			urlMap[url] = true
-		}
+	if err := c.Cluster.Validate(); err != nil {
+		return err
 	}
 	}
 
 
 	// Advertised peer URLs must match those in the cluster peer list
 	// Advertised peer URLs must match those in the cluster peer list

+ 3 - 0
etcdserver/server.go

@@ -185,6 +185,9 @@ func NewServer(cfg *ServerConfig) (*EtcdServer, error) {
 			if cfg.Cluster, err = NewClusterFromString(cfg.Cluster.token, s); err != nil {
 			if cfg.Cluster, err = NewClusterFromString(cfg.Cluster.token, s); err != nil {
 				return nil, err
 				return nil, err
 			}
 			}
+			if cfg.Cluster.Validate() != nil {
+				return nil, fmt.Errorf("bad discovery cluster: %v", err)
+			}
 		}
 		}
 		cfg.Cluster.SetStore(st)
 		cfg.Cluster.SetStore(st)
 		cfg.PrintWithInitial()
 		cfg.PrintWithInitial()