@@ -43,17 +43,19 @@ import (
4343)
4444
4545type Manager struct {
46- mu sync.RWMutex
47- m map [uid.ID ]* Environment
48- taskman * task.ManagerV2
49- incomingEventCh <- chan event.Event
46+ mu sync.RWMutex
47+ m map [uid.ID ]* Environment
48+ taskman * task.ManagerV2
49+ incomingEventCh <- chan event.Event
50+ pendingTeardownsCh map [uid.ID ]chan * event.TasksReleasedEvent
5051}
5152
5253func NewEnvManager (tm * task.ManagerV2 , incomingEventCh <- chan event.Event ) * Manager {
5354 envman := & Manager {
5455 m : make (map [uid.ID ]* Environment ),
5556 taskman : tm ,
5657 incomingEventCh : incomingEventCh ,
58+ pendingTeardownsCh : make (map [uid.ID ]chan * event.TasksReleasedEvent ),
5759 }
5860
5961 go func () {
@@ -63,6 +65,14 @@ func NewEnvManager(tm *task.ManagerV2, incomingEventCh <-chan event.Event) *Mana
6365 switch typedEvent := incomingEvent .(type ) {
6466 case event.DeviceEvent :
6567 envman .handleDeviceEvent (typedEvent )
68+ case * event.TasksReleasedEvent :
69+ // If we got a TasksReleasedEvent, it must be matched with a pending
70+ // environment teardown.
71+ if thisEnvCh , ok := envman .pendingTeardownsCh [typedEvent .GetEnvironmentId ()]; ok {
72+ thisEnvCh <- typedEvent
73+ close (thisEnvCh )
74+ delete (envman .pendingTeardownsCh , typedEvent .GetEnvironmentId ())
75+ }
6676 default :
6777 // noop
6878 }
@@ -167,7 +177,30 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error
167177 }
168178
169179 taskmanMessage := task .NewEnvironmentMessage (taskop .ReleaseTasks ,environmentId .Array (), env .Workflow ().GetTasks (), nil )
180+
181+ pendingCh := make (chan * event.TasksReleasedEvent )
182+ envs .pendingTeardownsCh [environmentId .Array ()] = pendingCh
183+ envs .mu .Unlock ()
170184 envs .taskman .MessageChannel <- taskmanMessage
185+
186+ incomingEv := <- pendingCh
187+ envs .mu .Lock ()
188+
189+ // If some tasks failed to release
190+ if taskReleaseErrors := incomingEv .GetTaskReleaseErrors (); len (taskReleaseErrors ) > 0 {
191+ for taskId , err := range taskReleaseErrors {
192+ log .WithFields (logrus.Fields {
193+ "taskId" : taskId ,
194+ "environmentId" : environmentId ,
195+ }).
196+ WithError (err ).
197+ Warn ("task failed to release" )
198+ }
199+ err = fmt .Errorf ("%d tasks failed to release for environment %s" ,
200+ len (taskReleaseErrors ), environmentId )
201+ return err
202+ }
203+
171204 // err = envs.taskman.ReleaseTasks(environmentId.Array(), env.Workflow().GetTasks())
172205 // if err != nil {
173206 // return err
0 commit comments