Skip to content

Commit

Permalink
tr: Fetch Wait channel before killTask in restart
Browse files Browse the repository at this point in the history
Currently, if killTask results in the termination of a process before
calling WaitTask, Restart() will incorrectly return a TaskNotFound
error when using the raw_exec driver on Windows.
  • Loading branch information
endocrimes committed Jun 26, 2019
1 parent 72b9b87 commit 079cfb4
Showing 1 changed file with 7 additions and 6 deletions.
13 changes: 7 additions & 6 deletions client/allocrunner/taskrunner/lifecycle.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,18 +28,19 @@ func (tr *TaskRunner) Restart(ctx context.Context, event *structs.TaskEvent, fai
// Tell the restart tracker that a restart triggered the exit
tr.restartTracker.SetRestartTriggered(failure)

// Grab a handle to the wait channel that will timeout with context cancelation
// _before_ killing the task.
waitCh, err := handle.WaitCh(ctx)
if err != nil {
return err
}

// Kill the task using an exponential backoff in-case of failures.
if err := tr.killTask(handle); err != nil {
// We couldn't successfully destroy the resource created.
tr.logger.Error("failed to kill task. Resources may have been leaked", "error", err)
}

// Drain the wait channel or wait for the request context to be canceled
waitCh, err := handle.WaitCh(ctx)
if err != nil {
return err
}

select {
case <-waitCh:
case <-ctx.Done():
Expand Down

0 comments on commit 079cfb4

Please sign in to comment.