Skip to content

Commit 9fe31cf

Browse files
limingyaoojunfuchen99
authored andcommitted
fix: force shutdown unclosed services (#1743)
(cherry picked from commit 4ab2587)
1 parent 93f8ae0 commit 9fe31cf

File tree

2 files changed

+55
-1
lines changed

2 files changed

+55
-1
lines changed

src/main/java/com/aws/greengrass/lifecyclemanager/GenericExternalService.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,23 @@ protected void shutdown() {
600600
}
601601
}
602602

603+
/**
604+
* Shutdown a service without running the shutdown script.
605+
* Including stop processes and clean up resources.
606+
*/
607+
public void forceShutdown() {
608+
609+
stopAllLifecycleProcessesWithoutLock(lifecycleProcesses);
610+
611+
// Clean up any resource manager entities (can be OS specific) that might have been created for this
612+
// component.
613+
systemResourceController.removeResourceController(this);
614+
615+
logger.atInfo().setEventType("force-service-shutdown").log();
616+
617+
resetRunWith();
618+
}
619+
603620
/**
604621
* Stop all the lifecycle processes.
605622
*
@@ -631,6 +648,27 @@ private void stopProcesses(List<Exec> processes) {
631648
}
632649
}
633650

651+
/**
652+
* Force stop processes without acquiring the lock.
653+
*/
654+
@SuppressWarnings("PMD.CloseResource")
655+
private void stopAllLifecycleProcessesWithoutLock(List<Exec> processes) {
656+
for (Exec e : processes) {
657+
if (e != null && e.isRunning()) {
658+
logger.atInfo().log("Force shutting down process {}", e);
659+
try {
660+
e.close();
661+
logger.atInfo().log("Force shutdown completed for process {}", e);
662+
processes.remove(e);
663+
} catch (IOException ex) {
664+
logger.atWarn().log("Force shutdown timed out for process {}", e);
665+
}
666+
} else {
667+
processes.remove(e);
668+
}
669+
}
670+
}
671+
634672
@Override
635673
public void handleError() throws InterruptedException {
636674
if (getConfig().findNode(GreengrassService.SERVICE_LIFECYCLE_NAMESPACE_TOPIC,

src/main/java/com/aws/greengrass/lifecyclemanager/KernelLifecycle.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -504,7 +504,23 @@ public void stopAllServices(int timeoutSeconds) {
504504
List<String> unclosedServices =
505505
IntStream.range(0, arr.length).filter((i) -> !arr[i].isDone() || arr[i].isCompletedExceptionally())
506506
.mapToObj((i) -> d[i].getName()).collect(Collectors.toList());
507-
logger.atError("services-shutdown-errored", e).kv("unclosedServices", unclosedServices).log();
507+
508+
logger.atError("services-shutdown-errored", e).kv("unclosedServices", unclosedServices)
509+
.log("Force closing services");
510+
511+
for (String unclosedService : unclosedServices) {
512+
try {
513+
GreengrassService service = kernel.locate(unclosedService);
514+
// for generic external service, kill processes and clean up
515+
if (service instanceof GenericExternalService) {
516+
GenericExternalService genericService = (GenericExternalService) service;
517+
genericService.forceShutdown();
518+
}
519+
} catch (ServiceLoadException ex) {
520+
logger.atWarn().log("Could not locate service: {} for forced process cleanup. "
521+
+ "Skipping cleanup for this service.", unclosedService, ex);
522+
}
523+
}
508524
}
509525
}
510526

0 commit comments

Comments
 (0)