Browse code

Merge pull request #13559 from LK4D4/fix_systemd_listen

Treat systemd listeners as all other

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