Skip to content

Commit 523a164

Browse files
alloc_runner: stop sidecars in separate loop
1 parent 97e9ac4 commit 523a164

File tree

1 file changed

+63
-39
lines changed

1 file changed

+63
-39
lines changed

client/allocrunner/alloc_runner.go

+63-39
Original file line numberDiff line numberDiff line change
@@ -604,56 +604,80 @@ func (ar *allocRunner) handleTaskStateUpdates() {
604604
func (ar *allocRunner) killTasks() map[string]*structs.TaskState {
605605
var mu sync.Mutex
606606
states := make(map[string]*structs.TaskState, len(ar.tasks))
607-
607+
608608
// run alloc prekill hooks
609609
ar.preKillHooks()
610-
610+
611611
// Kill leader first, synchronously
612612
for name, tr := range ar.tasks {
613-
if !tr.IsLeader() {
614-
continue
615-
}
616-
617-
taskEvent := structs.NewTaskEvent(structs.TaskKilling)
618-
taskEvent.SetKillTimeout(tr.Task().KillTimeout)
619-
err := tr.Kill(context.TODO(), taskEvent)
620-
if err != nil && err != taskrunner.ErrTaskNotRunning {
621-
ar.logger.Warn("error stopping leader task", "error", err, "task_name", name)
622-
}
623-
624-
taskState := tr.TaskState()
625-
states[name] = taskState
626-
break
613+
if !tr.IsLeader() {
614+
continue
615+
}
616+
617+
taskEvent := structs.NewTaskEvent(structs.TaskKilling)
618+
taskEvent.SetKillTimeout(tr.Task().KillTimeout)
619+
err := tr.Kill(context.TODO(), taskEvent)
620+
if err != nil && err != taskrunner.ErrTaskNotRunning {
621+
ar.logger.Warn("error stopping leader task", "error", err, "task_name", name)
622+
}
623+
624+
taskState := tr.TaskState()
625+
states[name] = taskState
626+
break
627627
}
628-
628+
629629
// Kill the rest non-sidecar or poststop tasks concurrently
630630
wg := sync.WaitGroup{}
631631
for name, tr := range ar.tasks {
632-
// Filter out poststop and sidecar tasks so that they stop after all the other tasks are killed
633-
if tr.IsLeader() || tr.IsPoststopTask() || tr.IsSidecarTask() {
634-
continue
635-
}
636-
637-
wg.Add(1)
638-
go func(name string, tr *taskrunner.TaskRunner) {
639-
defer wg.Done()
640-
taskEvent := structs.NewTaskEvent(structs.TaskKilling)
641-
taskEvent.SetKillTimeout(tr.Task().KillTimeout)
642-
err := tr.Kill(context.TODO(), taskEvent)
643-
if err != nil && err != taskrunner.ErrTaskNotRunning {
644-
ar.logger.Warn("error stopping task", "error", err, "task_name", name)
645-
}
646-
647-
taskState := tr.TaskState()
648-
mu.Lock()
649-
states[name] = taskState
650-
mu.Unlock()
651-
}(name, tr)
632+
// Filter out poststop and sidecar tasks so that they stop after all the other tasks are killed
633+
if tr.IsLeader() || tr.IsPoststopTask() || tr.IsSidecarTask() {
634+
continue
635+
}
636+
637+
wg.Add(1)
638+
go func(name string, tr *taskrunner.TaskRunner) {
639+
defer wg.Done()
640+
taskEvent := structs.NewTaskEvent(structs.TaskKilling)
641+
taskEvent.SetKillTimeout(tr.Task().KillTimeout)
642+
err := tr.Kill(context.TODO(), taskEvent)
643+
if err != nil && err != taskrunner.ErrTaskNotRunning {
644+
ar.logger.Warn("error stopping task", "error", err, "task_name", name)
645+
}
646+
647+
taskState := tr.TaskState()
648+
mu.Lock()
649+
states[name] = taskState
650+
mu.Unlock()
651+
}(name, tr)
652652
}
653653
wg.Wait()
654-
654+
655+
// Kill the sidecar tasks last.
656+
for name, tr := range ar.tasks {
657+
if !tr.IsSidecarTask() || tr.IsLeader() || tr.IsPoststopTask() {
658+
continue
659+
}
660+
661+
wg.Add(1)
662+
go func(name string, tr *taskrunner.TaskRunner) {
663+
defer wg.Done()
664+
taskEvent := structs.NewTaskEvent(structs.TaskKilling)
665+
taskEvent.SetKillTimeout(tr.Task().KillTimeout)
666+
err := tr.Kill(context.TODO(), taskEvent)
667+
if err != nil && err != taskrunner.ErrTaskNotRunning {
668+
ar.logger.Warn("error stopping task", "error", err, "task_name", name)
669+
}
670+
671+
taskState := tr.TaskState()
672+
mu.Lock()
673+
states[name] = taskState
674+
mu.Unlock()
675+
}(name, tr)
676+
}
677+
wg.Wait()
678+
655679
return states
656-
}
680+
}
657681

658682
// clientAlloc takes in the task states and returns an Allocation populated
659683
// with Client specific fields

0 commit comments

Comments
 (0)