Merge pull request #5828 from cpuguy83/shimv2_exit_on_signals
shimv2: handle sigint/sigterm
This commit is contained in:
commit
82af36e59b
@ -305,7 +305,7 @@ func run(ctx context.Context, manager Manager, initFunc Init, name string, confi
|
|||||||
"pid": os.Getpid(),
|
"pid": os.Getpid(),
|
||||||
"namespace": namespaceFlag,
|
"namespace": namespaceFlag,
|
||||||
})
|
})
|
||||||
go handleSignals(ctx, logger, signals)
|
go reap(ctx, logger, signals)
|
||||||
ss, err := manager.Stop(ctx, id)
|
ss, err := manager.Stop(ctx, id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -428,7 +428,7 @@ func run(ctx context.Context, manager Manager, initFunc Init, name string, confi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := serve(ctx, server, signals); err != nil {
|
if err := serve(ctx, server, signals, sd.Shutdown); err != nil {
|
||||||
if err != shutdown.ErrShutdown {
|
if err != shutdown.ErrShutdown {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -450,7 +450,7 @@ func run(ctx context.Context, manager Manager, initFunc Init, name string, confi
|
|||||||
|
|
||||||
// serve serves the ttrpc API over a unix socket in the current working directory
|
// serve serves the ttrpc API over a unix socket in the current working directory
|
||||||
// and blocks until the context is canceled
|
// and blocks until the context is canceled
|
||||||
func serve(ctx context.Context, server *ttrpc.Server, signals chan os.Signal) error {
|
func serve(ctx context.Context, server *ttrpc.Server, signals chan os.Signal, shutdown func()) error {
|
||||||
dump := make(chan os.Signal, 32)
|
dump := make(chan os.Signal, 32)
|
||||||
setupDumpStacks(dump)
|
setupDumpStacks(dump)
|
||||||
|
|
||||||
@ -480,7 +480,9 @@ func serve(ctx context.Context, server *ttrpc.Server, signals chan os.Signal) er
|
|||||||
dumpStacks(logger)
|
dumpStacks(logger)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
return handleSignals(ctx, logger, signals)
|
|
||||||
|
go handleExitSignals(ctx, logger, shutdown)
|
||||||
|
return reap(ctx, logger, signals)
|
||||||
}
|
}
|
||||||
|
|
||||||
func dumpStacks(logger *logrus.Entry) {
|
func dumpStacks(logger *logrus.Entry) {
|
||||||
|
@ -71,7 +71,7 @@ func serveListener(path string) (net.Listener, error) {
|
|||||||
return l, nil
|
return l, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleSignals(ctx context.Context, logger *logrus.Entry, signals chan os.Signal) error {
|
func reap(ctx context.Context, logger *logrus.Entry, signals chan os.Signal) error {
|
||||||
logger.Info("starting signal loop")
|
logger.Info("starting signal loop")
|
||||||
|
|
||||||
for {
|
for {
|
||||||
@ -79,6 +79,8 @@ func handleSignals(ctx context.Context, logger *logrus.Entry, signals chan os.Si
|
|||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
return ctx.Err()
|
return ctx.Err()
|
||||||
case s := <-signals:
|
case s := <-signals:
|
||||||
|
// Exit signals are handled separately from this loop
|
||||||
|
// They get registered with this channel so that we can ignore such signals for short-running actions (e.g. `delete`)
|
||||||
switch s {
|
switch s {
|
||||||
case unix.SIGCHLD:
|
case unix.SIGCHLD:
|
||||||
if err := reaper.Reap(); err != nil {
|
if err := reaper.Reap(); err != nil {
|
||||||
@ -90,6 +92,22 @@ func handleSignals(ctx context.Context, logger *logrus.Entry, signals chan os.Si
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func handleExitSignals(ctx context.Context, logger *logrus.Entry, cancel context.CancelFunc) {
|
||||||
|
ch := make(chan os.Signal, 32)
|
||||||
|
signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM)
|
||||||
|
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case s := <-ch:
|
||||||
|
logger.WithField("signal", s).Debugf("Caught exit signal")
|
||||||
|
cancel()
|
||||||
|
return
|
||||||
|
case <-ctx.Done():
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func openLog(ctx context.Context, _ string) (io.Writer, error) {
|
func openLog(ctx context.Context, _ string) (io.Writer, error) {
|
||||||
return fifo.OpenFifoDup2(ctx, "log", unix.O_WRONLY, 0700, int(os.Stderr.Fd()))
|
return fifo.OpenFifoDup2(ctx, "log", unix.O_WRONLY, 0700, int(os.Stderr.Fd()))
|
||||||
}
|
}
|
||||||
|
@ -46,10 +46,13 @@ func serveListener(path string) (net.Listener, error) {
|
|||||||
return nil, errors.New("not supported")
|
return nil, errors.New("not supported")
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleSignals(ctx context.Context, logger *logrus.Entry, signals chan os.Signal) error {
|
func reap(ctx context.Context, logger *logrus.Entry, signals chan os.Signal) error {
|
||||||
return errors.New("not supported")
|
return errors.New("not supported")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func handleExitSignals(ctx context.Context, logger *logrus.Entry, cancel context.CancelFunc) {
|
||||||
|
}
|
||||||
|
|
||||||
func openLog(ctx context.Context, _ string) (io.Writer, error) {
|
func openLog(ctx context.Context, _ string) (io.Writer, error) {
|
||||||
return nil, errors.New("not supported")
|
return nil, errors.New("not supported")
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user