浏览代码

Treat systemd listeners as all other

Fix #13549

Signed-off-by: Alexander Morozov <lk4d4@docker.com>
Alexander Morozov 10 年之前
父节点
当前提交
6f9fa64645
共有 2 个文件被更改,包括 30 次插入37 次删除
  1. 10 8
      api/server/server.go
  2. 20 29
      api/server/server_linux.go

+ 10 - 8
api/server/server.go

@@ -97,15 +97,17 @@ func (s *Server) ServeApi(protoAddrs []string) error {
 		if err != nil {
 		if err != nil {
 			return err
 			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++ {
 	for i := 0; i < len(protoAddrs); i++ {

+ 20 - 29
api/server/server_linux.go

@@ -12,57 +12,48 @@ import (
 	"github.com/docker/docker/pkg/systemd"
 	"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 (
 	var (
 		err error
 		err error
-		l   net.Listener
+		ls  []net.Listener
 	)
 	)
 	switch proto {
 	switch proto {
 	case "fd":
 	case "fd":
-		ls, err := systemd.ListenFD(addr)
+		ls, err = systemd.ListenFD(addr)
 		if err != nil {
 		if err != nil {
 			return nil, err
 			return nil, err
 		}
 		}
-		chErrors := make(chan error, len(ls))
 		// We don't want to start serving on these sockets until the
 		// We don't want to start serving on these sockets until the
 		// daemon is initialized and installed. Otherwise required handlers
 		// daemon is initialized and installed. Otherwise required handlers
 		// won't be ready.
 		// won't be ready.
 		<-s.start
 		<-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":
 	case "tcp":
-		l, err = s.initTcpSocket(addr)
+		l, err := s.initTcpSocket(addr)
 		if err != nil {
 		if err != nil {
 			return nil, err
 			return nil, err
 		}
 		}
+		ls = append(ls, l)
 	case "unix":
 	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
 			return nil, err
 		}
 		}
+		ls = append(ls, l)
 	default:
 	default:
 		return nil, fmt.Errorf("Invalid protocol format: %q", proto)
 		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) {
 func (s *Server) AcceptConnections(d *daemon.Daemon) {