Browse code

Return listenbuffer behavior

Now we're start to serve early, but all Accept calls are intercepted by
listenbuffer or systemd socket.

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

Alexander Morozov authored on 2015/10/08 05:50:06
Showing 2 changed files
... ...
@@ -76,11 +76,10 @@ func (s *Server) Close() {
76 76
 }
77 77
 
78 78
 // ServeAPI loops through all initialized servers and spawns goroutine
79
-// with Server method for each. It sets CreateMux() as Handler also.
79
+// with Serve() method for each.
80 80
 func (s *Server) ServeAPI() error {
81 81
 	var chErrors = make(chan error, len(s.servers))
82 82
 	for _, srv := range s.servers {
83
-		srv.srv.Handler = s.CreateMux()
84 83
 		go func(srv *HTTPServer) {
85 84
 			var err error
86 85
 			logrus.Infof("API listen on %s", srv.l.Addr())
... ...
@@ -162,9 +161,13 @@ func (s *Server) makeHTTPHandler(handler httputils.APIFunc) http.HandlerFunc {
162 162
 }
163 163
 
164 164
 // InitRouters initializes a list of routers for the server.
165
+// Sets those routers as Handler for each server.
165 166
 func (s *Server) InitRouters(d *daemon.Daemon) {
166 167
 	s.addRouter(local.NewRouter(d))
167 168
 	s.addRouter(network.NewRouter(d))
169
+	for _, srv := range s.servers {
170
+		srv.srv.Handler = s.CreateMux()
171
+	}
168 172
 }
169 173
 
170 174
 // addRouter adds a new router to the server.
... ...
@@ -235,6 +235,21 @@ func (cli *DaemonCli) CmdDaemon(args ...string) error {
235 235
 		logrus.Fatal(err)
236 236
 	}
237 237
 
238
+	// The serve API routine never exits unless an error occurs
239
+	// We need to start it as a goroutine and wait on it so
240
+	// daemon doesn't exit
241
+	// All servers must be protected with some mechanism (systemd socket, listenbuffer)
242
+	// which prevents real handling of request until routes will be set.
243
+	serveAPIWait := make(chan error)
244
+	go func() {
245
+		if err := api.ServeAPI(); err != nil {
246
+			logrus.Errorf("ServeAPI error: %v", err)
247
+			serveAPIWait <- err
248
+			return
249
+		}
250
+		serveAPIWait <- nil
251
+	}()
252
+
238 253
 	if err := migrateKey(); err != nil {
239 254
 		logrus.Fatal(err)
240 255
 	}
... ...
@@ -262,19 +277,6 @@ func (cli *DaemonCli) CmdDaemon(args ...string) error {
262 262
 
263 263
 	api.InitRouters(d)
264 264
 
265
-	// The serve API routine never exits unless an error occurs
266
-	// We need to start it as a goroutine and wait on it so
267
-	// daemon doesn't exit
268
-	serveAPIWait := make(chan error)
269
-	go func() {
270
-		if err := api.ServeAPI(); err != nil {
271
-			logrus.Errorf("ServeAPI error: %v", err)
272
-			serveAPIWait <- err
273
-			return
274
-		}
275
-		serveAPIWait <- nil
276
-	}()
277
-
278 265
 	signal.Trap(func() {
279 266
 		api.Close()
280 267
 		<-serveAPIWait