@@ -433,19 +433,15 @@ func (agent *ecsAgent) doStart(containerChangeEventStream *eventstream.EventStre
433
433
return exitcodes .ExitTerminal
434
434
}
435
435
436
+ // Load Managed Daemon images asynchronously
437
+ agent .loadManagedDaemonImagesAsync (imageManager )
438
+
436
439
scManager := agent .serviceconnectManager
437
440
scManager .SetECSClient (client , agent .containerInstanceARN )
438
441
if loaded , _ := scManager .IsLoaded (agent .dockerClient ); loaded {
439
442
imageManager .AddImageToCleanUpExclusionList (agent .serviceconnectManager .GetLoadedImageName ())
440
443
}
441
444
442
- // exclude all daemon images from cleanup
443
- for _ , csiDM := range agent .daemonManagers {
444
- if loaded , _ := csiDM .IsLoaded (agent .dockerClient ); loaded {
445
- imageManager .AddImageToCleanUpExclusionList (csiDM .GetManagedDaemon ().GetLoadedDaemonImageRef ())
446
- }
447
- }
448
-
449
445
// Add container instance ARN to metadata manager
450
446
if agent .cfg .ContainerMetadataEnabled .Enabled () {
451
447
agent .metadataManager .SetContainerInstanceARN (agent .containerInstanceARN )
@@ -485,7 +481,7 @@ func (agent *ecsAgent) doStart(containerChangeEventStream *eventstream.EventStre
485
481
agent .startAsyncRoutines (containerChangeEventStream , credentialsManager , imageManager ,
486
482
taskEngine , deregisterInstanceEventStream , client , taskHandler , attachmentEventHandler , state , doctor )
487
483
// TODO add EBS watcher to async routines
488
- agent .startEBSWatcher (state , taskEngine )
484
+ agent .startEBSWatcher (state , taskEngine , agent . dockerClient )
489
485
// Start the acs session, which should block doStart
490
486
return agent .startACSSession (credentialsManager , taskEngine ,
491
487
deregisterInstanceEventStream , client , state , taskHandler , doctor )
@@ -751,6 +747,38 @@ func (agent *ecsAgent) constructVPCSubnetAttributes() []*ecs.Attribute {
751
747
}
752
748
}
753
749
750
+ // Loads Managed Daemon images for all Managed Daemons registered on the Agent.
751
+ // The images are loaded in the background. Successfully loaded images are added to
752
+ // imageManager's cleanup exclusion list.
753
+ func (agent * ecsAgent ) loadManagedDaemonImagesAsync (imageManager engine.ImageManager ) {
754
+ daemonManagers := agent .getDaemonManagers ()
755
+ logger .Debug (fmt .Sprintf ("Will load images for %d Managed Daemons" , len (daemonManagers )))
756
+ for _ , daemonManager := range daemonManagers {
757
+ go agent .loadManagedDaemonImage (daemonManager , imageManager )
758
+ }
759
+ }
760
+
761
+ // Loads Managed Daemon image and adds it to image cleanup exclusion list upon success.
762
+ func (agent * ecsAgent ) loadManagedDaemonImage (dm dm.DaemonManager , imageManager engine.ImageManager ) {
763
+ imageRef := dm .GetManagedDaemon ().GetImageRef ()
764
+ logger .Info ("Starting to load Managed Daemon image" , logger.Fields {
765
+ field .ImageRef : imageRef ,
766
+ })
767
+ image , err := dm .LoadImage (agent .ctx , agent .dockerClient )
768
+ if err != nil {
769
+ logger .Error ("Failed to load Managed Daemon image" , logger.Fields {
770
+ field .ImageRef : imageRef ,
771
+ field .Error : err ,
772
+ })
773
+ return
774
+ }
775
+ logger .Info ("Successfully loaded Managed Daemon image" , logger.Fields {
776
+ field .ImageRef : imageRef ,
777
+ field .ImageID : image .ID ,
778
+ })
779
+ imageManager .AddImageToCleanUpExclusionList (imageRef )
780
+ }
781
+
754
782
// registerContainerInstance registers the container instance ID for the ECS Agent
755
783
func (agent * ecsAgent ) registerContainerInstance (
756
784
client api.ECSClient ,
@@ -1140,6 +1168,11 @@ func (agent *ecsAgent) setDaemonManager(key string, val dm.DaemonManager) {
1140
1168
agent .daemonManagers [key ] = val
1141
1169
}
1142
1170
1171
+ // Returns daemon managers map. Not designed to be thread-safe.
1172
+ func (agent * ecsAgent ) getDaemonManagers () map [string ]dm.DaemonManager {
1173
+ return agent .daemonManagers
1174
+ }
1175
+
1143
1176
// setVPCSubnet sets the vpc and subnet ids for the agent by querying the
1144
1177
// instance metadata service
1145
1178
func (agent * ecsAgent ) setVPCSubnet () (error , bool ) {
0 commit comments