Gate task.Wait status check on checkpoints

Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
This commit is contained in:
Michael Crosby 2017-08-03 17:32:44 -04:00
parent 9f13b414b9
commit fdc5a475a8

30
task.go
View File

@ -8,6 +8,7 @@ import (
"io" "io"
goruntime "runtime" goruntime "runtime"
"strings" "strings"
"sync"
"syscall" "syscall"
eventsapi "github.com/containerd/containerd/api/services/events/v1" eventsapi "github.com/containerd/containerd/api/services/events/v1"
@ -93,6 +94,7 @@ type task struct {
id string id string
pid uint32 pid uint32
mu sync.Mutex
deferred *tasks.CreateTaskRequest deferred *tasks.CreateTaskRequest
} }
@ -102,9 +104,14 @@ func (t *task) Pid() uint32 {
} }
func (t *task) Start(ctx context.Context) error { func (t *task) Start(ctx context.Context) error {
if t.deferred != nil { t.mu.Lock()
response, err := t.client.TaskService().Create(ctx, t.deferred) deferred := t.deferred
t.mu.Unlock()
if deferred != nil {
response, err := t.client.TaskService().Create(ctx, deferred)
t.mu.Lock()
t.deferred = nil t.deferred = nil
t.mu.Unlock()
if err != nil { if err != nil {
t.io.closer.Close() t.io.closer.Close()
return err return err
@ -166,13 +173,18 @@ func (t *task) Wait(ctx context.Context) (uint32, error) {
if err != nil { if err != nil {
return UnknownExitStatus, errdefs.FromGRPC(err) return UnknownExitStatus, errdefs.FromGRPC(err)
} }
// first check if the task has exited t.mu.Lock()
status, err := t.Status(ctx) checkpoint := t.deferred != nil
if err != nil { t.mu.Unlock()
return UnknownExitStatus, errdefs.FromGRPC(err) if !checkpoint {
} // first check if the task has exited
if status.Status == Stopped { status, err := t.Status(ctx)
return status.ExitStatus, nil if err != nil {
return UnknownExitStatus, errdefs.FromGRPC(err)
}
if status.Status == Stopped {
return status.ExitStatus, nil
}
} }
for { for {
evt, err := eventstream.Recv() evt, err := eventstream.Recv()