summaryrefslogtreecommitdiffhomepage
path: root/runsc/specutils
diff options
context:
space:
mode:
Diffstat (limited to 'runsc/specutils')
-rw-r--r--runsc/specutils/specutils.go9
-rw-r--r--runsc/specutils/specutils_test.go7
2 files changed, 12 insertions, 4 deletions
diff --git a/runsc/specutils/specutils.go b/runsc/specutils/specutils.go
index 34243e623..861e7fd70 100644
--- a/runsc/specutils/specutils.go
+++ b/runsc/specutils/specutils.go
@@ -324,9 +324,14 @@ func WaitForReady(pid int, timeout time.Duration, ready func() (bool, error)) er
// Check if the process is still running.
var ws syscall.WaitStatus
var ru syscall.Rusage
+
+ // If the process is alive, child is 0 because of the NOHANG option.
+ // If the process has terminated, child equals the process id.
child, err := syscall.Wait4(pid, &ws, syscall.WNOHANG, &ru)
- if err != nil || child == pid {
- return fmt.Errorf("process (%d) is not running, err: %v", pid, err)
+ if err != nil {
+ return fmt.Errorf("error waiting for process: %v", err)
+ } else if child == pid {
+ return fmt.Errorf("process %d has terminated", pid)
}
// Process continues to run, backoff and retry.
diff --git a/runsc/specutils/specutils_test.go b/runsc/specutils/specutils_test.go
index 959be3af3..2dc5d90cc 100644
--- a/runsc/specutils/specutils_test.go
+++ b/runsc/specutils/specutils_test.go
@@ -76,8 +76,11 @@ func TestWaitForReadyNotRunning(t *testing.T) {
err := WaitForReady(cmd.Process.Pid, 5*time.Second, func() (bool, error) {
return false, nil
})
- if !strings.Contains(err.Error(), "not running") {
- t.Errorf("ProcessWaitReady got: %v, expected: not running", err)
+ if err != nil && !strings.Contains(err.Error(), "terminated") {
+ t.Errorf("ProcessWaitReady got: %v, expected: process terminated", err)
+ }
+ if err == nil {
+ t.Errorf("ProcessWaitReady incorrectly succeeded")
}
}