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
This commit is contained in:
Fabricio Voznika 2018-06-04 12:13:33 -07:00 committed by Shentubot
parent 55a37ceef1
commit 78ccd1298e
2 changed files with 21 additions and 5 deletions

View File

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

View File

@ -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
}
}
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 false
}
// killProcess sends a signal to the host process (i.e. a sandbox or gofer