in twill-yarn/src/main/java/org/apache/twill/internal/appmaster/ApplicationMasterService.java [244:286]
protected void doStop() throws Exception {
Thread.interrupted(); // This is just to clear the interrupt flag
LOG.info("Stop application master with spec: {}", TwillSpecificationAdapter.create().toJson(twillSpec));
if (eventHandler != null) {
try {
// call event handler destroy. If there is error, only log and not affected stop sequence.
eventHandler.destroy();
} catch (Throwable t) {
LOG.warn("Exception when calling {}.destroy()", eventHandler.getClass().getName(), t);
}
}
instanceChangeExecutor.shutdownNow();
// For checking if all containers are stopped.
final Set<String> ids = Sets.newHashSet(runningContainers.getContainerIds());
YarnAMClient.AllocateHandler handler = new YarnAMClient.AllocateHandler() {
@Override
public void acquired(List<? extends ProcessLauncher<YarnContainerInfo>> launchers) {
// no-op
}
@Override
public void completed(List<YarnContainerStatus> completed) {
for (YarnContainerStatus status : completed) {
ids.remove(status.getContainerId());
}
}
};
runningContainers.stopAll();
// Poll for 5 seconds to wait for containers to stop.
int count = 0;
while (!ids.isEmpty() && count++ < 5) {
amClient.allocate(0.0f, handler);
TimeUnit.SECONDS.sleep(1);
}
cleanupDir();
}