main: fix proxy initialization and setupCluster

release-2.0
Jonathan Boulle 2014-10-23 15:31:49 -07:00
parent d8258c38be
commit d7301a5cf4
4 changed files with 28 additions and 13 deletions

View File

@ -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)
}

View File

@ -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

29
main.go
View File

@ -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 {

View File

@ -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",