Browse code

Treat systemd listeners as all other

Fix #13549

Signed-off-by: Alexander Morozov <lk4d4@docker.com>

Alexander Morozov authored on 2015/05/29 04:15:03
Showing 2 changed files
... ...
@@ -97,15 +97,17 @@ func (s *Server) ServeApi(protoAddrs []string) error {
97 97
 		if err != nil {
98 98
 			return err
99 99
 		}
100
-		s.servers = append(s.servers, srv)
100
+		s.servers = append(s.servers, srv...)
101 101
 
102
-		go func(proto, addr string) {
103
-			logrus.Infof("Listening for HTTP on %s (%s)", proto, addr)
104
-			if err := srv.Serve(); err != nil && strings.Contains(err.Error(), "use of closed network connection") {
105
-				err = nil
106
-			}
107
-			chErrors <- err
108
-		}(protoAddrParts[0], protoAddrParts[1])
102
+		for _, s := range srv {
103
+			logrus.Infof("Listening for HTTP on %s (%s)", protoAddrParts[0], protoAddrParts[1])
104
+			go func(s serverCloser) {
105
+				if err := s.Serve(); err != nil && strings.Contains(err.Error(), "use of closed network connection") {
106
+					err = nil
107
+				}
108
+				chErrors <- err
109
+			}(s)
110
+		}
109 111
 	}
110 112
 
111 113
 	for i := 0; i < len(protoAddrs); i++ {
... ...
@@ -12,57 +12,48 @@ import (
12 12
 	"github.com/docker/docker/pkg/systemd"
13 13
 )
14 14
 
15
-// newServer sets up the required serverCloser and does protocol specific checking.
16
-func (s *Server) newServer(proto, addr string) (serverCloser, error) {
15
+// newServer sets up the required serverClosers and does protocol specific checking.
16
+func (s *Server) newServer(proto, addr string) ([]serverCloser, error) {
17 17
 	var (
18 18
 		err error
19
-		l   net.Listener
19
+		ls  []net.Listener
20 20
 	)
21 21
 	switch proto {
22 22
 	case "fd":
23
-		ls, err := systemd.ListenFD(addr)
23
+		ls, err = systemd.ListenFD(addr)
24 24
 		if err != nil {
25 25
 			return nil, err
26 26
 		}
27
-		chErrors := make(chan error, len(ls))
28 27
 		// We don't want to start serving on these sockets until the
29 28
 		// daemon is initialized and installed. Otherwise required handlers
30 29
 		// won't be ready.
31 30
 		<-s.start
32
-		// Since ListenFD will return one or more sockets we have
33
-		// to create a go func to spawn off multiple serves
34
-		for i := range ls {
35
-			listener := ls[i]
36
-			go func() {
37
-				httpSrv := http.Server{Handler: s.router}
38
-				chErrors <- httpSrv.Serve(listener)
39
-			}()
40
-		}
41
-		for i := 0; i < len(ls); i++ {
42
-			if err := <-chErrors; err != nil {
43
-				return nil, err
44
-			}
45
-		}
46
-		return nil, nil
47 31
 	case "tcp":
48
-		l, err = s.initTcpSocket(addr)
32
+		l, err := s.initTcpSocket(addr)
49 33
 		if err != nil {
50 34
 			return nil, err
51 35
 		}
36
+		ls = append(ls, l)
52 37
 	case "unix":
53
-		if l, err = sockets.NewUnixSocket(addr, s.cfg.SocketGroup, s.start); err != nil {
38
+		l, err := sockets.NewUnixSocket(addr, s.cfg.SocketGroup, s.start)
39
+		if err != nil {
54 40
 			return nil, err
55 41
 		}
42
+		ls = append(ls, l)
56 43
 	default:
57 44
 		return nil, fmt.Errorf("Invalid protocol format: %q", proto)
58 45
 	}
59
-	return &HttpServer{
60
-		&http.Server{
61
-			Addr:    addr,
62
-			Handler: s.router,
63
-		},
64
-		l,
65
-	}, nil
46
+	var res []serverCloser
47
+	for _, l := range ls {
48
+		res = append(res, &HttpServer{
49
+			&http.Server{
50
+				Addr:    addr,
51
+				Handler: s.router,
52
+			},
53
+			l,
54
+		})
55
+	}
56
+	return res, nil
66 57
 }
67 58
 
68 59
 func (s *Server) AcceptConnections(d *daemon.Daemon) {