Fix #13549
Signed-off-by: Alexander Morozov <lk4d4@docker.com>
| ... | ... |
@@ -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) {
|