From 75bb340137e3938a3e44eef7586213be4d345c3f Mon Sep 17 00:00:00 2001 From: Binbin Zhang Date: Mon, 22 Nov 2021 20:23:31 +0800 Subject: [PATCH] shimv2/service: fix defer funtions never run with os.Exit() os.Exit() will terminate program immediately, the defer functions won't be executed, so we add defer functions again before os.Exit(). Refer to https://pkg.go.dev/os#Exit Fixes: #3059 Signed-off-by: Binbin Zhang --- src/runtime/pkg/containerd-shim-v2/service.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/runtime/pkg/containerd-shim-v2/service.go b/src/runtime/pkg/containerd-shim-v2/service.go index 29cd259f94..cafbb19072 100644 --- a/src/runtime/pkg/containerd-shim-v2/service.go +++ b/src/runtime/pkg/containerd-shim-v2/service.go @@ -953,6 +953,12 @@ func (s *service) Shutdown(ctx context.Context, r *taskAPI.ShutdownRequest) (_ * // exited when shimv2 terminated. Thus here to do the last cleanup of the hypervisor. syscall.Kill(int(s.hpid), syscall.SIGKILL) + // os.Exit() will terminate program immediately, the defer functions won't be executed, + // so we add defer functions again before os.Exit(). + // Refer to https://pkg.go.dev/os#Exit + shimLog.WithField("container", r.ID).Debug("Shutdown() end") + rpcDurationsHistogram.WithLabelValues("shutdown").Observe(float64(time.Since(start).Nanoseconds() / int64(time.Millisecond))) + os.Exit(0) // This will never be called, but this is only there to make sure the