diff --git a/drivers/rawexec/driver.go b/drivers/rawexec/driver.go index ff9ab9987..52cdf4794 100644 --- a/drivers/rawexec/driver.go +++ b/drivers/rawexec/driver.go @@ -292,6 +292,8 @@ func (d *Driver) RecoverTask(handle *drivers.TaskHandle) error { procState: drivers.TaskStateRunning, startedAt: taskState.StartedAt, exitResult: &drivers.ExitResult{}, + logger: d.logger, + doneCh: make(chan struct{}), } d.tasks.Set(taskState.TaskConfig.ID, h) @@ -356,6 +358,7 @@ func (d *Driver) StartTask(cfg *drivers.TaskConfig) (*drivers.TaskHandle, *drive procState: drivers.TaskStateRunning, startedAt: time.Now().Round(time.Millisecond), logger: d.logger, + doneCh: make(chan struct{}), } driverState := TaskState{ @@ -426,6 +429,12 @@ func (d *Driver) StopTask(taskID string, timeout time.Duration, signal string) e return fmt.Errorf("executor Shutdown failed: %v", err) } + // Wait for handle to finish + <-handle.doneCh + + // Kill executor + handle.pluginClient.Kill() + return nil } diff --git a/drivers/rawexec/driver_pre09.go b/drivers/rawexec/driver_pre09.go index a6fd2d7c1..0ed5d9a37 100644 --- a/drivers/rawexec/driver_pre09.go +++ b/drivers/rawexec/driver_pre09.go @@ -38,6 +38,8 @@ func (d *Driver) recoverPre09Task(h *drivers.TaskHandle) error { procState: drivers.TaskStateRunning, startedAt: time.Now(), exitResult: &drivers.ExitResult{}, + logger: d.logger, + doneCh: make(chan struct{}), } d.tasks.Set(h.Config.ID, th) diff --git a/drivers/rawexec/handle.go b/drivers/rawexec/handle.go index 0e46277e3..fa8162261 100644 --- a/drivers/rawexec/handle.go +++ b/drivers/rawexec/handle.go @@ -26,6 +26,7 @@ type taskHandle struct { startedAt time.Time completedAt time.Time exitResult *drivers.ExitResult + doneCh chan struct{} } func (h *taskHandle) TaskStatus() *drivers.TaskStatus { @@ -52,6 +53,7 @@ func (h *taskHandle) IsRunning() bool { } func (h *taskHandle) run() { + defer close(h.doneCh) h.stateLock.Lock() if h.exitResult == nil { h.exitResult = &drivers.ExitResult{}