1313import com .aws .greengrass .lifecyclemanager .GreengrassService ;
1414import com .aws .greengrass .lifecyclemanager .Kernel ;
1515import com .aws .greengrass .lifecyclemanager .exceptions .ServiceLoadException ;
16- import edu .umd .cs .findbugs .annotations .SuppressFBWarnings ;
1716
1817import java .util .HashMap ;
19- import java .util .LinkedList ;
2018import java .util .Map ;
21- import java .util .Queue ;
2219import java .util .Set ;
2320import java .util .concurrent .CompletableFuture ;
2421import java .util .stream .Collectors ;
@@ -82,6 +79,9 @@ public void activate(Map<String, Object> newConfig, Deployment deployment,
8279
8380 try {
8481 Set <GreengrassService > servicesToTrack = servicesChangeManager .servicesToTrack ();
82+ // Exclude all non-autoStartable services and their dependers
83+ // Find the services which both changed and auto startable
84+ servicesToTrack .retainAll (kernel .findAutoStartableServicesToTrack ());
8585 logger .atDebug (MERGE_CONFIG_EVENT_KEY ).kv ("serviceToTrack" , servicesToTrack ).kv ("mergeTime" , mergeTime )
8686 .log ("Applied new service config. Waiting for services to complete update" );
8787 waitForServicesToStart (servicesToTrack , mergeTime , kernel , totallyCompleteFuture );
@@ -144,10 +144,13 @@ void rollback(DeploymentDocument deploymentDocument, CompletableFuture<Deploymen
144144 // be expected to still be broken
145145 Set <GreengrassService > servicesToTrackForRollback = rollbackManager .servicesToTrack ();
146146
147- // Also don't track services if they have (transitive) hard dependencies on already-broken services
148- Set <GreengrassService > brokenServiceAndDependers
149- = findServiceDependers (servicesToTrackForRollback , rollbackManager .getAlreadyBrokenServices ());
147+ // Convert broken services names from String to GreengrassService type
148+ Set <GreengrassService > brokenServices = servicesToTrackForRollback .stream ()
149+ .filter (service -> rollbackManager .getAlreadyBrokenServices ().contains (service .getName ()))
150+ .collect (Collectors .toSet ());
150151
152+ // Also don't track services if they have (transitive) hard dependencies on already-broken services
153+ Set <GreengrassService > brokenServiceAndDependers = kernel .findDependers (brokenServices );
151154 servicesToTrackForRollback .removeAll (brokenServiceAndDependers );
152155
153156 logger .atInfo (MERGE_CONFIG_EVENT_KEY )
@@ -170,37 +173,6 @@ void rollback(DeploymentDocument deploymentDocument, CompletableFuture<Deploymen
170173 }
171174 }
172175
173- /**
174- * Finds all services which are dependers of given broken services, directly or indirectly
175- * This method performs a breadth-first search, starting from the broken services and traversing through
176- * service dependencies.
177- * @param rollbackServices the set of rollback services to track
178- * @param brokenServiceNames the set of broken service names
179- * @return a set of all services depending on the broken services, including themselves
180- */
181- @ SuppressFBWarnings ("RV_RETURN_VALUE_IGNORED_BAD_PRACTICE" )
182- private Set <GreengrassService > findServiceDependers (final Set <GreengrassService > rollbackServices ,
183- final Set <String > brokenServiceNames ) {
184-
185- Set <GreengrassService > dependerServices = rollbackServices .stream ()
186- .filter (service -> brokenServiceNames .contains (service .getName ()))
187- .collect (Collectors .toSet ());
188- Queue <GreengrassService > dependers = new LinkedList <>(dependerServices );
189-
190- // Breadth-first search to find all dependent services, staring from broken services
191- while (!dependers .isEmpty ()) {
192- GreengrassService currentService = dependers .poll ();
193- for (GreengrassService depender : currentService .getHardDependers ()) {
194- // Ensure dependers haven't been processed
195- if (dependerServices .add (depender )) {
196- dependers .offer (depender );
197- }
198- }
199- }
200- return dependerServices ;
201- }
202-
203-
204176 private void handleFailureRollback (CompletableFuture totallyCompleteFuture , Throwable deploymentFailureCause ,
205177 Throwable rollbackFailureCause ) {
206178 // Rollback execution failed
@@ -209,5 +181,4 @@ private void handleFailureRollback(CompletableFuture totallyCompleteFuture, Thro
209181 totallyCompleteFuture .complete (new DeploymentResult (DeploymentResult .DeploymentStatus .FAILED_UNABLE_TO_ROLLBACK ,
210182 deploymentFailureCause ));
211183 }
212-
213184}
0 commit comments