From be39be87f6ae8a94656906ebb2aa7edf4e6d210d Mon Sep 17 00:00:00 2001 From: Cory Snider Date: Tue, 28 Feb 2023 19:59:36 -0500 Subject: [PATCH] api/server: delete Wait method It's surprising that the method to begin serving requests is named Wait. And it is unidiomatic: it is a synchronous call, but it sends its return value to the channel passed in as an argument instead of just returning the value. And ultimately it is just a trivial wrapper around serveAPI. Export the ServeAPI method instead so callers can decide how to call and synchronize around it. Call ServeAPI synchronously on the main goroutine in cmd/dockerd. The goroutine and channel which the Wait() API demanded are superfluous after all. The notifyReady() call was always concurrent and asynchronous with respect to serving the API (its implementation spawns a goroutine) so it makes no difference whether it is called before ServeAPI() or after `go ServeAPI()`. Signed-off-by: Cory Snider --- api/server/server.go | 17 ++--------------- cmd/dockerd/daemon.go | 16 +++++++--------- 2 files changed, 9 insertions(+), 24 deletions(-) diff --git a/api/server/server.go b/api/server/server.go index e8714eb060..c96c84750a 100644 --- a/api/server/server.go +++ b/api/server/server.go @@ -77,9 +77,8 @@ func (s *Server) Close() { } } -// serveAPI loops through all initialized servers and spawns goroutine -// with Serve method for each. It sets createMux() as Handler also. -func (s *Server) serveAPI() error { +// Serve starts listening for inbound requests. +func (s *Server) Serve() error { var chErrors = make(chan error, len(s.servers)) for _, srv := range s.servers { srv.srv.Handler = s.createMux() @@ -194,15 +193,3 @@ func (s *Server) createMux() *mux.Router { return m } - -// Wait blocks the server goroutine until it exits. -// It sends an error message if there is any error during -// the API execution. -func (s *Server) Wait(waitChan chan error) { - if err := s.serveAPI(); err != nil { - logrus.Errorf("ServeAPI error: %v", err) - waitChan <- err - return - } - waitChan <- nil -} diff --git a/cmd/dockerd/daemon.go b/cmd/dockerd/daemon.go index 8389378174..30ebb59667 100644 --- a/cmd/dockerd/daemon.go +++ b/cmd/dockerd/daemon.go @@ -239,18 +239,16 @@ func (cli *DaemonCli) start(opts *daemonOptions) (err error) { cli.setupConfigReloadTrap() - // The serve API routine never exits unless an error occurs - // We need to start it as a goroutine and wait on it so - // daemon doesn't exit - serveAPIWait := make(chan error) - go cli.api.Wait(serveAPIWait) - // after the daemon is done setting up we can notify systemd api notifyReady() - // Daemon is fully initialized and handling API traffic - // Wait for serve API to complete - errAPI := <-serveAPIWait + // Daemon is fully initialized. Start handling API traffic + // and wait for serve API to complete. + errAPI := cli.api.Serve() + if errAPI != nil { + logrus.WithError(errAPI).Error("ServeAPI error") + } + c.Cleanup() // notify systemd that we're shutting down