Browse Source

etcdserver: try to listen on ports before initializing etcd server

Xiang Li 11 years ago
parent
commit
dd09042632
1 changed files with 37 additions and 27 deletions
  1. 37 27
      etcdmain/etcd.go

+ 37 - 27
etcdmain/etcd.go

@@ -20,6 +20,7 @@ import (
 	"flag"
 	"fmt"
 	"log"
+	"net"
 	"net/http"
 	"os"
 	"strings"
@@ -172,42 +173,22 @@ func startEtcd() {
 	if err != nil {
 		log.Fatal(err.Error())
 	}
-	cfg := &etcdserver.ServerConfig{
-		Name:         *name,
-		ClientURLs:   acurls,
-		DataDir:      *dir,
-		SnapCount:    *snapCount,
-		Cluster:      cls,
-		DiscoveryURL: *durl,
-		ClusterState: *clusterState,
-		Transport:    pt,
-	}
-	s := etcdserver.NewServer(cfg)
-	s.Start()
-
-	ch := &cors.CORSHandler{
-		Handler: etcdhttp.NewClientHandler(s),
-		Info:    corsInfo,
-	}
-	ph := etcdhttp.NewPeerHandler(s)
 
 	lpurls, err := flags.URLsFromFlags(fs, "listen-peer-urls", "peer-bind-addr", peerTLSInfo)
 	if err != nil {
 		log.Fatal(err.Error())
 	}
 
+	plns := make([]net.Listener, 0)
 	for _, u := range lpurls {
 		l, err := transport.NewListener(u.Host, peerTLSInfo)
 		if err != nil {
 			log.Fatal(err)
 		}
 
-		// Start the peer server in a goroutine
 		urlStr := u.String()
-		go func() {
-			log.Print("etcd: listening for peers on ", urlStr)
-			log.Fatal(http.Serve(l, ph))
-		}()
+		log.Print("etcd: listening for peers on ", urlStr)
+		plns = append(plns, l)
 	}
 
 	lcurls, err := flags.URLsFromFlags(fs, "listen-client-urls", "bind-addr", clientTLSInfo)
@@ -215,7 +196,7 @@ func startEtcd() {
 		log.Fatal(err.Error())
 	}
 
-	// Start a client server goroutine for each listen address
+	clns := make([]net.Listener, 0)
 	for _, u := range lcurls {
 		l, err := transport.NewListener(u.Host, clientTLSInfo)
 		if err != nil {
@@ -223,10 +204,39 @@ func startEtcd() {
 		}
 
 		urlStr := u.String()
-		go func() {
-			log.Print("etcd: listening for client requests on ", urlStr)
+		log.Print("etcd: listening for client requests on ", urlStr)
+		clns = append(clns, l)
+	}
+
+	cfg := &etcdserver.ServerConfig{
+		Name:         *name,
+		ClientURLs:   acurls,
+		DataDir:      *dir,
+		SnapCount:    *snapCount,
+		Cluster:      cls,
+		DiscoveryURL: *durl,
+		ClusterState: *clusterState,
+		Transport:    pt,
+	}
+	s := etcdserver.NewServer(cfg)
+	s.Start()
+
+	ch := &cors.CORSHandler{
+		Handler: etcdhttp.NewClientHandler(s),
+		Info:    corsInfo,
+	}
+	ph := etcdhttp.NewPeerHandler(s)
+	// Start the peer server in a goroutine
+	for _, l := range plns {
+		go func(l net.Listener) {
+			log.Fatal(http.Serve(l, ph))
+		}(l)
+	}
+	// Start a client server goroutine for each listen address
+	for _, l := range clns {
+		go func(l net.Listener) {
 			log.Fatal(http.Serve(l, ch))
-		}()
+		}(l)
 	}
 }