in src/main/java/org/apache/sling/discovery/commons/providers/base/MinEventDelayHandler.java [135:193]
private boolean triggerAsyncDelaying(final BaseTopologyView newView) {
final int validCancelCnt = cancelCnt;
final boolean triggered = runAfter(minEventDelaySecs /*seconds*/ , new Runnable() {
public void run() {
assertCorrectThreadPool();
lock.lock();
try{
if (cancelCnt!=validCancelCnt) {
logSilencer.infoOrDebug("asyncDelay.run-cancel-" + newView.getLocalClusterSyncTokenId(),
"asyncDelay.run: got cancelled (validCancelCnt="+validCancelCnt+", cancelCnt="+cancelCnt+"), quitting.");
return;
}
// unlock the CHANGED event for any subsequent call to handleTopologyChanged()
isDelaying = false;
// check if the new topology is already ready
TopologyView t = discoveryService.getTopology();
if (!(t instanceof BaseTopologyView)) {
logger.error("asyncDelay.run: done delaying. topology not of type BaseTopologyView: "+t);
// cannot continue in this case
return;
}
BaseTopologyView topology = (BaseTopologyView) t;
if (topology.isCurrent()) {
logSilencer.infoOrDebug("asyncDelay.run-done-" + newView.getLocalClusterSyncTokenId(),
"asyncDelay.run: done delaying. got new view: "+ topology.toShortString());
viewStateManager.handleNewViewNonDelayed(topology);
} else {
logSilencer.infoOrDebug("asyncDelay.run-done-" + newView.getLocalClusterSyncTokenId(),
"asyncDelay.run: done delaying. new view (still/again) not current, delaying again");
triggerAsyncDelaying(topology);
// we're actually not interested in the result here
// if the async part failed, then we have to rely
// on a later handleNewView to come in - we can't
// really send a view now cos it is not current.
// so we're really stuck to waiting for handleNewView
// in this case.
}
} catch(RuntimeException re) {
logger.error("RuntimeException: "+re, re);
throw re;
} catch(Error er) {
logger.error("Error: "+er, er);
throw er;
} finally {
lock.unlock();
}
}
});
logSilencer.infoOrDebug("triggerAsyncDelaying", "triggerAsyncDelaying: asynch delaying of "+minEventDelaySecs+" triggered: "+triggered);
if (triggered) {
isDelaying = true;
}
return triggered;
}