Browse Source

main: fix proxy initialization and setupCluster

Jonathan Boulle 11 years ago
parent
commit
d7301a5cf4
4 changed files with 28 additions and 13 deletions
  1. 5 1
      etcdserver/cluster.go
  2. 2 0
      etcdserver/cluster_test.go
  3. 17 12
      main.go
  4. 4 0
      main_test.go

+ 5 - 1
etcdserver/cluster.go

@@ -71,7 +71,11 @@ func NewClusterFromString(name string, cluster string) (*Cluster, error) {
 		if len(urls) == 0 || urls[0] == "" {
 		if len(urls) == 0 || urls[0] == "" {
 			return nil, fmt.Errorf("Empty URL given for %q", name)
 			return nil, fmt.Errorf("Empty URL given for %q", name)
 		}
 		}
-		m := NewMember(name, types.URLs(*flags.NewURLsValue(strings.Join(urls, ","))), c.name, nil)
+		purls := &flags.URLsValue{}
+		if err := purls.Set(strings.Join(urls, ",")); err != nil {
+			return nil, err
+		}
+		m := NewMember(name, types.URLs(*purls), c.name, nil)
 		if _, ok := c.members[m.ID]; ok {
 		if _, ok := c.members[m.ID]; ok {
 			return nil, fmt.Errorf("Member exists with identical ID %v", m)
 			return nil, fmt.Errorf("Member exists with identical ID %v", m)
 		}
 		}

+ 2 - 0
etcdserver/cluster_test.go

@@ -60,6 +60,8 @@ func TestClusterFromStringBad(t *testing.T) {
 		// no URL defined for member
 		// no URL defined for member
 		"mem1=,mem2=http://128.193.4.20:2379,mem3=http://10.0.0.2:2379",
 		"mem1=,mem2=http://128.193.4.20:2379,mem3=http://10.0.0.2:2379",
 		"mem1,mem2=http://128.193.4.20:2379,mem3=http://10.0.0.2:2379",
 		"mem1,mem2=http://128.193.4.20:2379,mem3=http://10.0.0.2:2379",
+		// bad URL for member
+		"default=http://localhost/",
 		// TODO(philips): anyone know of a 64 bit sha1 hash collision
 		// TODO(philips): anyone know of a 64 bit sha1 hash collision
 		// "06b2f82fd81b2c20=http://128.193.4.20:2379,02c60cb75083ceef=http://128.193.4.20:2379",
 		// "06b2f82fd81b2c20=http://128.193.4.20:2379,02c60cb75083ceef=http://128.193.4.20:2379",
 		// the same url for two members
 		// the same url for two members

+ 17 - 12
main.go

@@ -50,7 +50,6 @@ var (
 
 
 	initialCluster     = fs.String("initial-cluster", "default=http://localhost:2380,default=http://localhost:7001", "Initial cluster configuration for bootstrapping")
 	initialCluster     = fs.String("initial-cluster", "default=http://localhost:2380,default=http://localhost:7001", "Initial cluster configuration for bootstrapping")
 	initialClusterName = fs.String("initial-cluster-name", "etcd", "Initial name for the etcd cluster during bootstrap")
 	initialClusterName = fs.String("initial-cluster-name", "etcd", "Initial name for the etcd cluster during bootstrap")
-	cluster            = &etcdserver.Cluster{}
 	clusterState       = new(etcdserver.ClusterState)
 	clusterState       = new(etcdserver.ClusterState)
 
 
 	cors      = &pkg.CORSInfo{}
 	cors      = &pkg.CORSInfo{}
@@ -142,8 +141,9 @@ func main() {
 
 
 // startEtcd launches the etcd server and HTTP handlers for client/server communication.
 // startEtcd launches the etcd server and HTTP handlers for client/server communication.
 func startEtcd() {
 func startEtcd() {
-	if err := setupCluster(); err != nil {
-		log.Fatalf("etcd: setupCluster returned error %v", err)
+	cls, err := setupCluster()
+	if err != nil {
+		log.Fatalf("etcd: error setting up initial cluster: %v", err)
 	}
 	}
 
 
 	if *dir == "" {
 	if *dir == "" {
@@ -168,7 +168,7 @@ func startEtcd() {
 		ClientURLs:   acurls,
 		ClientURLs:   acurls,
 		DataDir:      *dir,
 		DataDir:      *dir,
 		SnapCount:    *snapCount,
 		SnapCount:    *snapCount,
-		Cluster:      cluster,
+		Cluster:      cls,
 		DiscoveryURL: *durl,
 		DiscoveryURL: *durl,
 		ClusterState: *clusterState,
 		ClusterState: *clusterState,
 		Transport:    pt,
 		Transport:    pt,
@@ -223,12 +223,17 @@ func startEtcd() {
 
 
 // startProxy launches an HTTP proxy for client communication which proxies to other etcd nodes.
 // startProxy launches an HTTP proxy for client communication which proxies to other etcd nodes.
 func startProxy() {
 func startProxy() {
+	cls, err := setupCluster()
+	if err != nil {
+		log.Fatalf("etcd: error setting up initial cluster: %v", err)
+	}
+
 	pt, err := transport.NewTransport(clientTLSInfo)
 	pt, err := transport.NewTransport(clientTLSInfo)
 	if err != nil {
 	if err != nil {
 		log.Fatal(err)
 		log.Fatal(err)
 	}
 	}
 
 
-	ph, err := proxy.NewHandler(pt, (*cluster).PeerURLs())
+	ph, err := proxy.NewHandler(pt, cls.PeerURLs())
 	if err != nil {
 	if err != nil {
 		log.Fatal(err)
 		log.Fatal(err)
 	}
 	}
@@ -262,32 +267,32 @@ func startProxy() {
 }
 }
 
 
 // setupCluster sets up the cluster definition for bootstrap or discovery.
 // setupCluster sets up the cluster definition for bootstrap or discovery.
-func setupCluster() error {
+func setupCluster() (*etcdserver.Cluster, error) {
 	set := make(map[string]bool)
 	set := make(map[string]bool)
 	fs.Visit(func(f *flag.Flag) {
 	fs.Visit(func(f *flag.Flag) {
 		set[f.Name] = true
 		set[f.Name] = true
 	})
 	})
 	if set["discovery"] && set["initial-cluster"] {
 	if set["discovery"] && set["initial-cluster"] {
-		return fmt.Errorf("both discovery and bootstrap-config are set")
+		return nil, fmt.Errorf("both discovery and bootstrap-config are set")
 	}
 	}
 	apurls, err := pkg.URLsFromFlags(fs, "advertise-peer-urls", "addr", peerTLSInfo)
 	apurls, err := pkg.URLsFromFlags(fs, "advertise-peer-urls", "addr", peerTLSInfo)
 	if err != nil {
 	if err != nil {
-		return err
+		return nil, err
 	}
 	}
 
 
-	err = nil
+	var cls *etcdserver.Cluster
 	switch {
 	switch {
 	case set["discovery"]:
 	case set["discovery"]:
 		clusterStr := genClusterString(*name, apurls)
 		clusterStr := genClusterString(*name, apurls)
-		cluster, err = etcdserver.NewClusterFromString(*durl, clusterStr)
+		cls, err = etcdserver.NewClusterFromString(*durl, clusterStr)
 	case set["initial-cluster"]:
 	case set["initial-cluster"]:
 		fallthrough
 		fallthrough
 	default:
 	default:
 		// We're statically configured, and cluster has appropriately been set.
 		// We're statically configured, and cluster has appropriately been set.
 		// Try to configure by indexing the static cluster by name.
 		// Try to configure by indexing the static cluster by name.
-		cluster, err = etcdserver.NewClusterFromString(*initialClusterName, *initialCluster)
+		cls, err = etcdserver.NewClusterFromString(*initialClusterName, *initialCluster)
 	}
 	}
-	return err
+	return cls, err
 }
 }
 
 
 func genClusterString(name string, urls types.URLs) string {
 func genClusterString(name string, urls types.URLs) string {

+ 4 - 0
main_test.go

@@ -28,6 +28,10 @@ func TestGenClusterString(t *testing.T) {
 		urls []string
 		urls []string
 		wstr string
 		wstr string
 	}{
 	}{
+		{
+			"default", []string{"http://127.0.0.1:4001"},
+			"default=http://127.0.0.1:4001",
+		},
 		{
 		{
 			"node1", []string{"http://0.0.0.0:2379", "http://1.1.1.1:2379"},
 			"node1", []string{"http://0.0.0.0:2379", "http://1.1.1.1:2379"},
 			"node1=http://0.0.0.0:2379,node1=http://1.1.1.1:2379",
 			"node1=http://0.0.0.0:2379,node1=http://1.1.1.1:2379",