From 46fad7ef80391b3ba5f111a7b8346fbf39ce5c06 Mon Sep 17 00:00:00 2001 From: Tolga Ceylan Date: Tue, 27 Feb 2018 12:17:02 -0800 Subject: [PATCH] fn: plumb up I/O errors from docker wait (#798) Reed Allman 's I/O error fix. --- api/agent/drivers/docker/docker.go | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/api/agent/drivers/docker/docker.go b/api/agent/drivers/docker/docker.go index b5ebe0da6..00845aa7b 100644 --- a/api/agent/drivers/docker/docker.go +++ b/api/agent/drivers/docker/docker.go @@ -384,14 +384,10 @@ type waitResult struct { // waitResult implements drivers.WaitResult func (w *waitResult) Wait(ctx context.Context) (drivers.RunResult, error) { - defer func() { - w.waiter.Close() - w.waiter.Wait() // wait for Close() to finish processing, to make sure we gather all logs - close(w.done) - }() + defer close(w.done) // wait until container is stopped (or ctx is cancelled if sooner) - status, err := w.drv.wait(ctx, w.container) + status, err := w.wait(ctx) return &runResult{ status: status, err: err, @@ -545,11 +541,18 @@ func (drv *DockerDriver) awaitHealthcheck(ctx context.Context, container string) return nil } -func (drv *DockerDriver) wait(ctx context.Context, container string) (status string, err error) { +func (w *waitResult) wait(ctx context.Context) (status string, err error) { // wait retries internally until ctx is up, so we can ignore the error and // just say it was a timeout if we have [fatal] errors talking to docker, etc. // a more prevalent case is calling wait & container already finished, so again ignore err. - exitCode, _ := drv.docker.WaitContainerWithContext(container, ctx) + exitCode, _ := w.drv.docker.WaitContainerWithContext(w.container, ctx) + + w.waiter.Close() + err = w.waiter.Wait() + if err != nil { + // plumb up i/o errors (NOTE: which MAY be typed) + return drivers.StatusError, err + } // check the context first, if it's done then exitCode is invalid iff zero // (can't know 100% without inspecting, but that's expensive and this is a good guess)