From fc53f5f6357ce64a4b36b279a907eaea4396ceca Mon Sep 17 00:00:00 2001 From: Nick Ethier Date: Tue, 20 Nov 2018 20:41:32 -0500 Subject: [PATCH] docker: sync access to exit result within a handle --- drivers/docker/driver.go | 7 +++---- drivers/docker/handle.go | 11 ++++++++++- plugins/drivers/driver.go | 6 ++++++ 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/drivers/docker/driver.go b/drivers/docker/driver.go index 6d7850451..f75e18404 100644 --- a/drivers/docker/driver.go +++ b/drivers/docker/driver.go @@ -83,8 +83,7 @@ type Driver struct { // coordinator is what tracks multiple image pulls against the same docker image coordinator *dockerCoordinator - // logger will log to the plugin output which is usually an 'executor.out' - // file located in the root of the TaskDir + // logger will log to the Nomad agent logger hclog.Logger } @@ -990,7 +989,7 @@ func (d *Driver) handleWait(ctx context.Context, ch chan *drivers.ExitResult, h defer close(ch) select { case <-h.waitCh: - ch <- h.exitResult + ch <- h.ExitResult() case <-ctx.Done(): ch <- &drivers.ExitResult{ Err: ctx.Err(), @@ -1080,7 +1079,7 @@ func (d *Driver) InspectTask(taskID string) (*drivers.TaskStatus, error) { "container_id": container.ID, }, NetworkOverride: h.net, - ExitResult: h.exitResult, + ExitResult: h.ExitResult(), } status.State = drivers.TaskStateUnknown diff --git a/drivers/docker/handle.go b/drivers/docker/handle.go index efc408508..0d4fc4205 100644 --- a/drivers/docker/handle.go +++ b/drivers/docker/handle.go @@ -38,7 +38,14 @@ type taskHandle struct { net *structs.DriverNetwork imageID string - exitResult *drivers.ExitResult + exitResult *drivers.ExitResult + exitResultLock sync.Mutex +} + +func (h *taskHandle) ExitResult() *drivers.ExitResult { + h.exitResultLock.Lock() + defer h.exitResultLock.Unlock() + return h.exitResult.Copy() } type taskHandleState struct { @@ -202,12 +209,14 @@ func (h *taskHandle) run() { } // Set the result + h.exitResultLock.Lock() h.exitResult = &drivers.ExitResult{ ExitCode: exitCode, Signal: 0, OOMKilled: oom, Err: werr, } + h.exitResultLock.Unlock() close(h.waitCh) } diff --git a/plugins/drivers/driver.go b/plugins/drivers/driver.go index 874020145..63e7a76e8 100644 --- a/plugins/drivers/driver.go +++ b/plugins/drivers/driver.go @@ -249,6 +249,12 @@ func (r *ExitResult) Successful() bool { return r.ExitCode == 0 && r.Signal == 0 && r.Err == nil } +func (r *ExitResult) Copy() *ExitResult { + res := new(ExitResult) + *res = *r + return res +} + type TaskStatus struct { ID string Name string