GetCallResult<T> gotten = server.entryGetter().tryGet(config.getCallConfig(), endOfTime, key,
processor, range);
if (gotten.failed()) {
CallFailure fail = gotten.getFailure();
if (fail.isRetriable()) {
retries = _add(retries, new NodeFailure(server, fail));
} else {
result.addFailed(new NodeFailure(server, fail));
}
continue;
}
// did we get the thing?
T entry = gotten.getResult();
if (entry != null) {
return result.addFailed(retries).setContents(server, entry);
}
// it not, it's 404, missing entry. Neither fail nor really success...
result = result.addMissing(server);
}
}
if (noRetries) { // if we can't retry, don't:
return result.addFailed(retries);
}
final long secondRoundStart = System.currentTimeMillis();
// Do we need any delay in between?
_doDelay(startTime, secondRoundStart, endOfTime);
// Otherwise: go over retry list first, and if that's not enough, try disabled
if (retries == null) {
retries = new LinkedList<NodeFailure>();
} else {
Iterator<NodeFailure> it = retries.iterator();
while (it.hasNext()) {
NodeFailure retry = it.next();
ClusterServerNode server = (ClusterServerNode) retry.getServer();
GetCallResult<T> gotten = server.entryGetter().tryGet(config.getCallConfig(), endOfTime, key,
processor, range);
if (gotten.succeeded()) {
T entry = gotten.getResult(); // got it?
if (entry != null) {
return result.addFailed(retries).setContents(server, entry);
}
// it not, it's 404, missing entry. Neither fail nor really success...
result = result.addMissing(server);
it.remove();
} else {
CallFailure fail = gotten.getFailure();
retry.addFailure(fail);
if (!fail.isRetriable()) {
result.addFailed(retry);
it.remove();
}
}
}
}
// if no success, add disabled nodes in the mix
for (int i = 0; i < nodeCount; ++i) {
ClusterServerNode server = nodes.node(i);
if (server.isDisabled()) {
if (System.currentTimeMillis() >= lastValidTime) {
return result.addFailed(retries);
}
GetCallResult<T> gotten = server.entryGetter().tryGet(config.getCallConfig(), endOfTime, key,
processor, range);
if (gotten.succeeded()) {
T entry = gotten.getResult(); // got it?
if (entry != null) {
return result.addFailed(retries).setContents(server, entry);
}
// it not, it's 404, missing entry. Neither fail nor really success...
result = result.addMissing(server);
} else {
CallFailure fail = gotten.getFailure();
if (fail.isRetriable()) {
retries.add(new NodeFailure(server, fail));
} else {
result.addFailed(new NodeFailure(server, fail));
}
}
}
}
long prevStartTime = secondRoundStart;
for (int i = 1; (i <= MAX_RETRIES_FOR_GET) && !retries.isEmpty(); ++i) {
final long currStartTime = System.currentTimeMillis();
_doDelay(prevStartTime, currStartTime, endOfTime);
Iterator<NodeFailure> it = retries.iterator();
while (it.hasNext()) {
if (System.currentTimeMillis() >= lastValidTime) {
return result.addFailed(retries);
}
NodeFailure retry = it.next();
ClusterServerNode server = (ClusterServerNode) retry.getServer();
GetCallResult<T> gotten = server.entryGetter().tryGet(config.getCallConfig(), endOfTime, key,
processor, range);
if (gotten.succeeded()) {
T entry = gotten.getResult(); // got it?
if (entry != null) {
return result.addFailed(retries).setContents(server, entry);
}
// it not, it's 404, missing entry. Neither fail nor really success...
result = result.addMissing(server);
it.remove();
} else {
CallFailure fail = gotten.getFailure();
retry.addFailure(fail);
if (!fail.isRetriable()) {
result.addFailed(retry);
it.remove();
}
}