diff --git a/etcd/etcd.go b/etcd/etcd.go index 35963435d..ebe1ab882 100644 --- a/etcd/etcd.go +++ b/etcd/etcd.go @@ -17,6 +17,7 @@ limitations under the License. package etcd import ( + "net" "net/http" "os" "path/filepath" @@ -36,11 +37,13 @@ import ( ) type Etcd struct { - Config *config.Config // etcd config - Store store.Store // data store - Registry *server.Registry // stores URL information for nodes - Server *server.Server // http server, runs on 4001 by default - PeerServer *server.PeerServer // peer server, runs on 7001 by default + Config *config.Config // etcd config + Store store.Store // data store + Registry *server.Registry // stores URL information for nodes + Server *server.Server // http server, runs on 4001 by default + PeerServer *server.PeerServer // peer server, runs on 7001 by default + listener net.Listener // Listener for Server + peerListener net.Listener // Listener for PeerServer } // New returns a new Etcd instance. @@ -179,14 +182,19 @@ func (e *Etcd) Run() { // the cluster could be out of work as long as the two nodes cannot transfer messages. e.PeerServer.Start(e.Config.Snapshot, e.Config.Discovery, e.Config.Peers) log.Infof("peer server [name %s, listen on %s, advertised url %s]", e.PeerServer.Config.Name, e.Config.Peer.BindAddr, e.PeerServer.Config.URL) - l := server.NewListener(psConfig.Scheme, e.Config.Peer.BindAddr, e.Config.PeerTLSInfo()) + e.peerListener = server.NewListener(psConfig.Scheme, e.Config.Peer.BindAddr, e.Config.PeerTLSInfo()) sHTTP := &ehttp.CORSHandler{e.PeerServer.HTTPHandler(), corsInfo} - log.Fatal(http.Serve(l, sHTTP)) + log.Fatal(http.Serve(e.peerListener, sHTTP)) }() log.Infof("etcd server [name %s, listen on %s, advertised url %s]", e.Server.Name, e.Config.BindAddr, e.Server.URL()) - l := server.NewListener(e.Config.EtcdTLSInfo().Scheme(), e.Config.BindAddr, e.Config.EtcdTLSInfo()) + e.listener = server.NewListener(e.Config.EtcdTLSInfo().Scheme(), e.Config.BindAddr, e.Config.EtcdTLSInfo()) sHTTP := &ehttp.CORSHandler{e.Server.HTTPHandler(), corsInfo} - log.Fatal(http.Serve(l, sHTTP)) + log.Fatal(http.Serve(e.listener, sHTTP)) +} + +func (e *Etcd) Close() { + e.listener.Close() + e.peerListener.Close() }