Skip to content

Commit

Permalink
shimv2: handle sigint/sigterm
Browse files Browse the repository at this point in the history
This causes sigint/sigterm to trigger a shutdown of the shim.
It is needed because otherwise the v2 shim hangs system shutdown.

Signed-off-by: Brian Goff <cpuguy83@gmail.com>
(cherry picked from commit 3ffb6a6)
Signed-off-by: Varsha Teratipally <teratipally@google.com>
  • Loading branch information
cpuguy83 authored and vteratipally committed Feb 3, 2022
1 parent dff924c commit ce35765
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 4 deletions.
4 changes: 2 additions & 2 deletions runtime/v2/shim/shim.go
Expand Up @@ -323,7 +323,7 @@ func serve(ctx context.Context, server *ttrpc.Server, path string) error {
go func() {
defer l.Close()
if err := server.Serve(ctx, l); err != nil &&
!strings.Contains(err.Error(), "use of closed network connection") {
!strings.Contains(err.Error(), "use of closed network connection") {
logrus.WithError(err).Fatal("containerd-shim: ttrpc server failure")
}
}()
Expand All @@ -343,4 +343,4 @@ func dumpStacks(logger *logrus.Entry) {
}
buf = buf[:stackSize]
logger.Infof("=== BEGIN goroutine stack dump ===\n%s\n=== END goroutine stack dump ===", buf)
}
}
20 changes: 19 additions & 1 deletion runtime/v2/shim/shim_unix.go
Expand Up @@ -70,14 +70,16 @@ func serveListener(path string) (net.Listener, error) {
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")

for {
select {
case <-ctx.Done():
return ctx.Err()
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 {
case unix.SIGCHLD:
if err := reaper.Reap(); err != nil {
Expand All @@ -89,6 +91,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) {
return fifo.OpenFifoDup2(ctx, "log", unix.O_WRONLY, 0700, int(os.Stderr.Fd()))
}
5 changes: 4 additions & 1 deletion runtime/v2/shim/shim_windows.go
Expand Up @@ -48,10 +48,13 @@ func serveListener(path string) (net.Listener, error) {
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")
}

func handleExitSignals(ctx context.Context, logger *logrus.Entry, cancel context.CancelFunc) {
}

func openLog(ctx context.Context, _ string) (io.Writer, error) {
return nil, errors.New("not supported")
}

0 comments on commit ce35765

Please sign in to comment.