in twill-yarn/src/main/java/org/apache/twill/internal/appmaster/ApplicationMasterService.java [482:519]
private long checkProvisionTimeout(long nextTimeoutCheck) {
if (System.currentTimeMillis() < nextTimeoutCheck) {
return nextTimeoutCheck;
}
// Invoke event handler for provision request timeout
Map<String, ExpectedContainers.ExpectedCount> expiredRequests = expectedContainers.getAll();
Map<String, Integer> runningCounts = runningContainers.countAll();
Map<String, Integer> completedContainerCount = runningContainers.getCompletedContainerCount();
List<EventHandler.TimeoutEvent> timeoutEvents = Lists.newArrayList();
for (Map.Entry<String, ExpectedContainers.ExpectedCount> entry : expiredRequests.entrySet()) {
String runnableName = entry.getKey();
ExpectedContainers.ExpectedCount expectedCount = entry.getValue();
int runningCount = runningCounts.containsKey(runnableName) ? runningCounts.get(runnableName) : 0;
int completedCount = completedContainerCount.containsKey(runnableName) ?
completedContainerCount.get(runnableName) : 0;
if (expectedCount.getCount() > runningCount + completedCount) {
timeoutEvents.add(new EventHandler.TimeoutEvent(runnableName, expectedCount.getCount(),
runningCount, expectedCount.getTimestamp()));
}
}
if (!timeoutEvents.isEmpty() && eventHandler != null) {
try {
EventHandler.TimeoutAction action = eventHandler.launchTimeout(timeoutEvents);
if (action.getTimeout() < 0) {
// Abort application
stop();
} else {
return nextTimeoutCheck + action.getTimeout();
}
} catch (Throwable t) {
LOG.warn("Exception when calling EventHandler {}. Ignore the result.", t);
}
}
return nextTimeoutCheck + Constants.PROVISION_TIMEOUT;
}