Handle signals first on boot

This handles signals first thing on boot so that plugins are able to
boot with the reaper enabled.

Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
This commit is contained in:
Michael Crosby 2017-09-14 15:55:50 -04:00
parent cf1d4223be
commit 7fdf8cd31e
5 changed files with 55 additions and 64 deletions

View File

@ -78,9 +78,11 @@ func main() {
var (
start = time.Now()
signals = make(chan os.Signal, 2048)
serverC = make(chan *server.Server)
ctx = log.WithModule(gocontext.Background(), "containerd")
config = defaultConfig()
)
done := handleSignals(ctx, signals, serverC)
// start the signal handler as soon as we can to make sure that
// we don't miss any signals during boot
signal.Notify(signals, handledSignals...)
@ -105,6 +107,7 @@ func main() {
if err != nil {
return err
}
serverC <- server
if config.Debug.Address != "" {
l, err := sys.GetLocalListener(config.Debug.Address, config.Debug.Uid, config.Debug.Gid)
if err != nil {
@ -127,7 +130,8 @@ func main() {
serve(log.WithModule(ctx, "grpc"), l, server.ServeGRPC)
log.G(ctx).Infof("containerd successfully booted in %fs", time.Since(start).Seconds())
return handleSignals(ctx, signals, server)
<-done
return nil
}
if err := app.Run(os.Args); err != nil {
fmt.Fprintf(os.Stderr, "containerd: %s\n", err)

View File

@ -1,39 +0,0 @@
package main
import (
"context"
"os"
"golang.org/x/sys/unix"
"github.com/containerd/containerd/log"
"github.com/containerd/containerd/reaper"
"github.com/containerd/containerd/server"
)
const defaultConfigPath = "/etc/containerd/config.toml"
var handledSignals = []os.Signal{
unix.SIGTERM,
unix.SIGINT,
unix.SIGUSR1,
unix.SIGCHLD,
}
func handleSignals(ctx context.Context, signals chan os.Signal, server *server.Server) error {
for s := range signals {
log.G(ctx).WithField("signal", s).Debug("received signal")
switch s {
case unix.SIGCHLD:
if err := reaper.Reap(); err != nil {
log.G(ctx).WithError(err).Error("reap containerd processes")
}
case unix.SIGUSR1:
dumpStacks()
default:
server.Stop()
return nil
}
}
return nil
}

View File

@ -1,4 +1,4 @@
// +build darwin freebsd solaris
// +build linux darwin freebsd solaris
package main
@ -23,8 +23,15 @@ var handledSignals = []os.Signal{
unix.SIGPIPE,
}
func handleSignals(ctx context.Context, signals chan os.Signal, server *server.Server) error {
for s := range signals {
func handleSignals(ctx context.Context, signals chan os.Signal, serverC chan *server.Server) chan struct{} {
done := make(chan struct{}, 1)
go func() {
var server *server.Server
for {
select {
case s := <-serverC:
server = s
case s := <-signals:
log.G(ctx).WithField("signal", s).Debug("received signal")
switch s {
case unix.SIGCHLD:
@ -36,9 +43,15 @@ func handleSignals(ctx context.Context, signals chan os.Signal, server *server.S
case unix.SIGPIPE:
continue
default:
if server == nil {
close(done)
return
}
server.Stop()
return nil
close(done)
}
}
return nil
}
}()
return done
}

View File

@ -19,10 +19,24 @@ var (
}
)
func handleSignals(ctx context.Context, signals chan os.Signal, server *server.Server) error {
for s := range signals {
func handleSignals(ctx context.Context, signals chan os.Signal, serverC chan *server.Server) chan struct{} {
done := make(chan struct{})
go func() {
var server *server.Server
for {
select {
case s := <-serverC:
server = s
case s := <-signals:
log.G(ctx).WithField("signal", s).Debug("received signal")
server.Stop()
if server == nil {
close(done)
return
}
return nil
server.Stop()
close(done)
}
}
}()
return done
}

View File

@ -87,5 +87,4 @@ func LoadConfig(path string, v *Config) error {
}
v.md = md
return nil
}