From d7301a5cf477670c97ae76d09098a2641dbf7e31 Mon Sep 17 00:00:00 2001 From: Jonathan Boulle Date: Thu, 23 Oct 2014 15:31:49 -0700 Subject: [PATCH] main: fix proxy initialization and setupCluster --- etcdserver/cluster.go | 6 +++++- etcdserver/cluster_test.go | 2 ++ main.go | 29 +++++++++++++++++------------ main_test.go | 4 ++++ 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/etcdserver/cluster.go b/etcdserver/cluster.go index 441f41e8c..6fa081c10 100644 --- a/etcdserver/cluster.go +++ b/etcdserver/cluster.go @@ -71,7 +71,11 @@ func NewClusterFromString(name string, cluster string) (*Cluster, error) { if len(urls) == 0 || urls[0] == "" { 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 { return nil, fmt.Errorf("Member exists with identical ID %v", m) } diff --git a/etcdserver/cluster_test.go b/etcdserver/cluster_test.go index 0c398a628..d3dc68bb8 100644 --- a/etcdserver/cluster_test.go +++ b/etcdserver/cluster_test.go @@ -60,6 +60,8 @@ func TestClusterFromStringBad(t *testing.T) { // 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", + // bad URL for member + "default=http://localhost/", // 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", // the same url for two members diff --git a/main.go b/main.go index ed368ef29..88093b711 100644 --- a/main.go +++ b/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") initialClusterName = fs.String("initial-cluster-name", "etcd", "Initial name for the etcd cluster during bootstrap") - cluster = &etcdserver.Cluster{} clusterState = new(etcdserver.ClusterState) cors = &pkg.CORSInfo{} @@ -142,8 +141,9 @@ func main() { // startEtcd launches the etcd server and HTTP handlers for client/server communication. 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 == "" { @@ -168,7 +168,7 @@ func startEtcd() { ClientURLs: acurls, DataDir: *dir, SnapCount: *snapCount, - Cluster: cluster, + Cluster: cls, DiscoveryURL: *durl, ClusterState: *clusterState, Transport: pt, @@ -223,12 +223,17 @@ func startEtcd() { // startProxy launches an HTTP proxy for client communication which proxies to other etcd nodes. func startProxy() { + cls, err := setupCluster() + if err != nil { + log.Fatalf("etcd: error setting up initial cluster: %v", err) + } + pt, err := transport.NewTransport(clientTLSInfo) if err != nil { log.Fatal(err) } - ph, err := proxy.NewHandler(pt, (*cluster).PeerURLs()) + ph, err := proxy.NewHandler(pt, cls.PeerURLs()) if err != nil { log.Fatal(err) } @@ -262,32 +267,32 @@ func startProxy() { } // setupCluster sets up the cluster definition for bootstrap or discovery. -func setupCluster() error { +func setupCluster() (*etcdserver.Cluster, error) { set := make(map[string]bool) fs.Visit(func(f *flag.Flag) { set[f.Name] = true }) 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) if err != nil { - return err + return nil, err } - err = nil + var cls *etcdserver.Cluster switch { case set["discovery"]: clusterStr := genClusterString(*name, apurls) - cluster, err = etcdserver.NewClusterFromString(*durl, clusterStr) + cls, err = etcdserver.NewClusterFromString(*durl, clusterStr) case set["initial-cluster"]: fallthrough default: // We're statically configured, and cluster has appropriately been set. // 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 { diff --git a/main_test.go b/main_test.go index fd92f5d92..e759c4b28 100644 --- a/main_test.go +++ b/main_test.go @@ -28,6 +28,10 @@ func TestGenClusterString(t *testing.T) { urls []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=http://0.0.0.0:2379,node1=http://1.1.1.1:2379",