in twill-yarn/src/main/java/org/apache/twill/internal/appmaster/ApplicationMasterMain.java [249:293]
protected void shutDown() throws Exception {
super.shutDown();
// Deletes ZK nodes created for the application execution.
// We don't have to worry about a race condition if another instance of the same app starts at the same time
// as when removal is performed. This is because we always create nodes with "createParent == true",
// which takes care of the parent node recreation if it is removed from here.
// Try to delete the /instances path. It may throws NotEmptyException if there are other instances of the
// same app running, which we can safely ignore and return.
if (!delete(Constants.INSTANCES_PATH_PREFIX)) {
return;
}
// Try to delete children under /discovery. It may fail with NotEmptyException if there are other instances
// of the same app running that has discovery services running.
List<String> children = zkClient.getChildren(Constants.DISCOVERY_PATH_PREFIX)
.get(TIMEOUT_SECONDS, TimeUnit.SECONDS).getChildren();
List<OperationFuture<?>> deleteFutures = new ArrayList<>();
for (String child : children) {
String path = Constants.DISCOVERY_PATH_PREFIX + "/" + child;
LOG.info("Removing ZK path: {}{}", zkClient.getConnectString(), path);
deleteFutures.add(zkClient.delete(path));
}
Futures.successfulAsList(deleteFutures).get(TIMEOUT_SECONDS, TimeUnit.SECONDS);
for (OperationFuture<?> future : deleteFutures) {
try {
future.get();
} catch (ExecutionException e) {
if (e.getCause() instanceof KeeperException.NotEmptyException) {
return;
}
throw e;
}
}
// Delete the /discovery. It may fail with NotEmptyException (due to race between apps),
// which can safely ignore and return.
if (!delete(Constants.DISCOVERY_PATH_PREFIX)) {
return;
}
// Delete the ZK path for the app namespace.
delete("/");
}