@@ -604,56 +604,80 @@ func (ar *allocRunner) handleTaskStateUpdates() {
604
604
func (ar * allocRunner ) killTasks () map [string ]* structs.TaskState {
605
605
var mu sync.Mutex
606
606
states := make (map [string ]* structs.TaskState , len (ar .tasks ))
607
-
607
+
608
608
// run alloc prekill hooks
609
609
ar .preKillHooks ()
610
-
610
+
611
611
// Kill leader first, synchronously
612
612
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
627
627
}
628
-
628
+
629
629
// Kill the rest non-sidecar or poststop tasks concurrently
630
630
wg := sync.WaitGroup {}
631
631
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 )
652
652
}
653
653
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
+
655
679
return states
656
- }
680
+ }
657
681
658
682
// clientAlloc takes in the task states and returns an Allocation populated
659
683
// with Client specific fields
0 commit comments