FutureForkJoin<FutureResponse> fp = new FutureForkJoin<FutureResponse>(1, false, futureResponses);
fp.addListener(new BaseFutureAdapter<FutureForkJoin<FutureResponse>>() {
@Override
public void operationComplete(final FutureForkJoin<FutureResponse> future) throws Exception {
boolean finished = false;
FutureResponse futureResponse = future.last();
// success if we could add the tracker, but also if the tracker
// is full and sent a denied message
boolean isFull = futureResponse != null && futureResponse.responseMessage() != null
&& futureResponse.responseMessage().type() == Type.DENIED;
boolean isPartial = futureResponse != null && futureResponse.responseMessage() != null
&& futureResponse.responseMessage().type() == Type.PARTIALLY_OK;
if (future.isSuccess() || isFull) {
if (!isFull) {
successAsked.add(futureResponse.request().recipient());
}
TrackerData newDataMap = futureResponse.responseMessage().trackerData(0);
if (newDataMap != null) {
Collection<PeerStatistic> newPeers = newDataMap.peerAddresses().keySet();
mergeDiff(secondaryQueue, newPeers, alreadyAsked, queueToAsk);
storeResult(peerOnTracker, newDataMap, futureResponse.request().recipient(), knownPeers);
for(PeerStatistic peerStatatistic:newPeers) {
secondaryQueue.add(peerStatatistic.peerAddress());
}
}
int successRequests = isFull ? successfulRequests.get() : successfulRequests.incrementAndGet();
finished = evaluate(peerOnTracker, successRequests, atLeastSuccessfullRequests,
atLeastEntriesFromTrackers, isGet);
LOG.debug("evaluation result: finished={}, {} / {}", finished, peerOnTracker.size(),
atLeastEntriesFromTrackers);
// if peer reported that he can provide more data, we keep
// the peer in the list
if (!finished && isPartial) {
LOG.debug("partial1: {}, secondaryQueue {}", futureResponse.request().recipient(), queueToAsk);
queueToAsk.add(futureResponse.request().recipient());
}
if (!finished && isFull) {
LOG.debug("tracker reported to be full. Check if finished due to full trackers.");
finished = trackerFull.incrementAndGet() >= maxTrackerFull;
}