From 147b33c180e686461baa533d47e9df6818d9a423 Mon Sep 17 00:00:00 2001 From: Alexander Morozov Date: Thu, 28 May 2015 12:15:03 -0700 Subject: [PATCH] Treat systemd listeners as all other Fix #13549 Signed-off-by: Alexander Morozov Upstream-commit: 6f9fa64645cd67eb10a9c8bd903df518d572f50d Component: engine --- components/engine/api/server/server.go | 18 +++---- components/engine/api/server/server_linux.go | 49 ++++++++------------ 2 files changed, 30 insertions(+), 37 deletions(-) diff --git a/components/engine/api/server/server.go b/components/engine/api/server/server.go index 1dd7b43b2b..083fbda342 100644 --- a/components/engine/api/server/server.go +++ b/components/engine/api/server/server.go @@ -97,15 +97,17 @@ func (s *Server) ServeApi(protoAddrs []string) error { if err != nil { return err } - s.servers = append(s.servers, srv) + s.servers = append(s.servers, srv...) - go func(proto, addr string) { - logrus.Infof("Listening for HTTP on %s (%s)", proto, addr) - if err := srv.Serve(); err != nil && strings.Contains(err.Error(), "use of closed network connection") { - err = nil - } - chErrors <- err - }(protoAddrParts[0], protoAddrParts[1]) + for _, s := range srv { + logrus.Infof("Listening for HTTP on %s (%s)", protoAddrParts[0], protoAddrParts[1]) + go func(s serverCloser) { + if err := s.Serve(); err != nil && strings.Contains(err.Error(), "use of closed network connection") { + err = nil + } + chErrors <- err + }(s) + } } for i := 0; i < len(protoAddrs); i++ { diff --git a/components/engine/api/server/server_linux.go b/components/engine/api/server/server_linux.go index a0cfee1f96..46797b6197 100644 --- a/components/engine/api/server/server_linux.go +++ b/components/engine/api/server/server_linux.go @@ -12,57 +12,48 @@ import ( "github.com/docker/docker/pkg/systemd" ) -// newServer sets up the required serverCloser and does protocol specific checking. -func (s *Server) newServer(proto, addr string) (serverCloser, error) { +// newServer sets up the required serverClosers and does protocol specific checking. +func (s *Server) newServer(proto, addr string) ([]serverCloser, error) { var ( err error - l net.Listener + ls []net.Listener ) switch proto { case "fd": - ls, err := systemd.ListenFD(addr) + ls, err = systemd.ListenFD(addr) if err != nil { return nil, err } - chErrors := make(chan error, len(ls)) // We don't want to start serving on these sockets until the // daemon is initialized and installed. Otherwise required handlers // won't be ready. <-s.start - // Since ListenFD will return one or more sockets we have - // to create a go func to spawn off multiple serves - for i := range ls { - listener := ls[i] - go func() { - httpSrv := http.Server{Handler: s.router} - chErrors <- httpSrv.Serve(listener) - }() - } - for i := 0; i < len(ls); i++ { - if err := <-chErrors; err != nil { - return nil, err - } - } - return nil, nil case "tcp": - l, err = s.initTcpSocket(addr) + l, err := s.initTcpSocket(addr) if err != nil { return nil, err } + ls = append(ls, l) case "unix": - if l, err = sockets.NewUnixSocket(addr, s.cfg.SocketGroup, s.start); err != nil { + l, err := sockets.NewUnixSocket(addr, s.cfg.SocketGroup, s.start) + if err != nil { return nil, err } + ls = append(ls, l) default: return nil, fmt.Errorf("Invalid protocol format: %q", proto) } - return &HttpServer{ - &http.Server{ - Addr: addr, - Handler: s.router, - }, - l, - }, nil + var res []serverCloser + for _, l := range ls { + res = append(res, &HttpServer{ + &http.Server{ + Addr: addr, + Handler: s.router, + }, + l, + }) + } + return res, nil } func (s *Server) AcceptConnections(d *daemon.Daemon) {