Merge pull request #5828 from cpuguy83/shimv2_exit_on_signals

shimv2: handle sigint/sigterm
This commit is contained in:
Michael Crosby 2022-01-31 10:47:39 -05:00 committed by GitHub
commit 82af36e59b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 29 additions and 6 deletions

View File

@ -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) {

View File

@ -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()))
} }

View File

@ -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")
} }