diff options
author | Fabricio Voznika <fvoznika@google.com> | 2018-06-04 12:13:33 -0700 |
---|---|---|
committer | Shentubot <shentubot@google.com> | 2018-06-04 12:14:23 -0700 |
commit | 78ccd1298e1386d9c5e0eb10d328ecb16b28ea02 (patch) | |
tree | 872979aaaa07f8702eaacafeb897541878d5fc36 | |
parent | 55a37ceef1e33cc72236db6e95f159963ddf40bd (diff) |
Return 'running' if gofer is still alive
Containerd will start deleting container and rootfs after container
is stopped. However, if gofer is still running, rootfs cleanup will
fail because of device busy.
This CL makes sure that gofer is not running when container state is
stopped.
Change from: lantaol@google.com
PiperOrigin-RevId: 199172668
Change-Id: I9d874eec3ecf74fd9c8edd7f62d9f998edef66fe
-rw-r--r-- | runsc/container/container_test.go | 2 | ||||
-rw-r--r-- | runsc/sandbox/sandbox.go | 24 |
2 files changed, 21 insertions, 5 deletions
diff --git a/runsc/container/container_test.go b/runsc/container/container_test.go index 0844cb9df..3af8d620c 100644 --- a/runsc/container/container_test.go +++ b/runsc/container/container_test.go @@ -186,6 +186,8 @@ func TestLifecycle(t *testing.T) { // ourselves. p, _ := os.FindProcess(s.Sandbox.Pid) p.Wait() + g, _ := os.FindProcess(s.Sandbox.GoferPid) + g.Wait() // Load the container from disk and check the status. s, err = container.Load(rootDir, id) diff --git a/runsc/sandbox/sandbox.go b/runsc/sandbox/sandbox.go index 91c44c996..bfaead1f2 100644 --- a/runsc/sandbox/sandbox.go +++ b/runsc/sandbox/sandbox.go @@ -440,13 +440,27 @@ func (s *Sandbox) Signal(cid string, sig syscall.Signal) error { return nil } -// IsRunning returns true iff the sandbox process is running. +// IsRunning returns true if the sandbox or gofer process is running. func (s *Sandbox) IsRunning() bool { - // Send a signal 0 to the sandbox process. - if err := killProcess(s.Pid, 0); err != nil { - return false + if s.Pid != 0 { + // Send a signal 0 to the sandbox process. + if err := killProcess(s.Pid, 0); err == nil { + return true + } + } + if s.GoferPid != 0 { + // Send a signal 0 to the gofer process. + if err := killProcess(s.GoferPid, 0); err == nil { + log.Warningf("Found orphan gofer process, pid: %d", s.GoferPid) + // Attempt to kill gofer if it's orphan. + killProcess(s.GoferPid, unix.SIGKILL) + + // Don't wait for gofer to die. Return 'running' and hope gofer is dead + // next time around. + return true + } } - return true + return false } // killProcess sends a signal to the host process (i.e. a sandbox or gofer |