summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorValentin Rothberg <rothberg@redhat.com>2020-01-16 11:58:50 +0100
committerValentin Rothberg <rothberg@redhat.com>2020-01-16 13:08:59 +0100
commit279bf40ab1d8427acda76a4e99fa7c3ba7b19ba6 (patch)
treecb6c063cc2dcacd835756ab742be513f32d26fa0
parent61fbce710b8d69e1203ea9055479a3f9dbe626b9 (diff)
downloadpodman-279bf40ab1d8427acda76a4e99fa7c3ba7b19ba6.tar.gz
podman-279bf40ab1d8427acda76a4e99fa7c3ba7b19ba6.tar.bz2
podman-279bf40ab1d8427acda76a4e99fa7c3ba7b19ba6.zip
service: don't block sigterm
Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
-rw-r--r--pkg/api/server/server.go36
1 files changed, 24 insertions, 12 deletions
diff --git a/pkg/api/server/server.go b/pkg/api/server/server.go
index 717c7a876..b27b6360d 100644
--- a/pkg/api/server/server.go
+++ b/pkg/api/server/server.go
@@ -36,6 +36,7 @@ import (
"os"
"os/signal"
"strings"
+ "syscall"
"time"
"github.com/containers/libpod/libpod"
@@ -43,7 +44,7 @@ import (
"github.com/gorilla/mux"
"github.com/gorilla/schema"
"github.com/pkg/errors"
- log "github.com/sirupsen/logrus"
+ "github.com/sirupsen/logrus"
)
type APIServer struct {
@@ -67,9 +68,6 @@ func NewServer(runtime *libpod.Runtime) (*APIServer, error) {
return nil, errors.Errorf("Wrong number of file descriptors from systemd for socket activation (%d != 1)", len(listeners))
}
- quit := make(chan os.Signal, 1)
- signal.Notify(quit)
-
router := mux.NewRouter()
server := APIServer{
@@ -88,7 +86,7 @@ func NewServer(runtime *libpod.Runtime) (*APIServer, error) {
}
server.Timer = time.AfterFunc(server.Duration, func() {
if err := server.Shutdown(); err != nil {
- log.Errorf("unable to shutdown server: %q", err)
+ logrus.Errorf("unable to shutdown server: %q", err)
}
})
@@ -106,7 +104,7 @@ func NewServer(runtime *libpod.Runtime) (*APIServer, error) {
router.NotFoundHandler = http.HandlerFunc(
func(w http.ResponseWriter, r *http.Request) {
// We can track user errors...
- log.Infof("Failed Request: (%d:%s) for %s:'%s'", http.StatusNotFound, http.StatusText(http.StatusNotFound), r.Method, r.URL.String())
+ logrus.Infof("Failed Request: (%d:%s) for %s:'%s'", http.StatusNotFound, http.StatusText(http.StatusNotFound), r.Method, r.URL.String())
http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
},
)
@@ -132,7 +130,7 @@ func NewServer(runtime *libpod.Runtime) (*APIServer, error) {
}
}
- if log.IsLevelEnabled(log.DebugLevel) {
+ if logrus.IsLevelEnabled(logrus.DebugLevel) {
router.Walk(func(route *mux.Route, r *mux.Router, ancestors []*mux.Route) error { // nolint
path, err := route.GetPathTemplate()
if err != nil {
@@ -142,7 +140,7 @@ func NewServer(runtime *libpod.Runtime) (*APIServer, error) {
if err != nil {
methods = []string{}
}
- log.Debugf("Methods: %s Path: %s", strings.Join(methods, ", "), path)
+ logrus.Debugf("Methods: %s Path: %s", strings.Join(methods, ", "), path)
return nil
})
}
@@ -154,9 +152,23 @@ func NewServer(runtime *libpod.Runtime) (*APIServer, error) {
func (s *APIServer) Serve() error {
defer s.CancelFunc()
- err := s.Server.Serve(s.Listener)
- if err != nil && err != http.ErrServerClosed {
- return errors.Wrap(err, "Failed to start APIServer")
+ sigChan := make(chan os.Signal, 1)
+ signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
+ errChan := make(chan error, 1)
+
+ go func() {
+ err := s.Server.Serve(s.Listener)
+ if err != nil && err != http.ErrServerClosed {
+ errChan <- errors.Wrap(err, "Failed to start APIServer")
+ }
+ errChan <- nil
+ }()
+
+ select {
+ case err := <-errChan:
+ return err
+ case sig := <-sigChan:
+ logrus.Info("APIServer terminated by signal %v", sig)
}
return nil
@@ -174,7 +186,7 @@ func (s *APIServer) Shutdown() error {
go func() {
err := s.Server.Shutdown(s.Context)
if err != nil && err != context.Canceled {
- log.Errorf("Failed to cleanly shutdown APIServer: %s", err.Error())
+ logrus.Errorf("Failed to cleanly shutdown APIServer: %s", err.Error())
}
}()