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>
| ... | ... |
@@ -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 |