for(int index=0; index < replicaCount; index++) {
final CountDownLatch latch = new CountDownLatch(1);
final GetFuture<T> rv =
new GetFuture<T>(latch, operationTimeout, key, executorService);
Operation op = opFact.replicaGet(key, index,
new ReplicaGetOperation.Callback() {
private Future<T> val = null;
@Override
public void receivedStatus(OperationStatus status) {
rv.set(val, status);
if (!replicaFuture.isDone()) {
replicaFuture.setCompletedFuture(rv);
}
}
@Override
public void gotData(String k, int flags, byte[] data) {
assert key.equals(k) : "Wrong key returned";
val = tcService.decode(tc, new CachedData(flags, data,
tc.getMaxSize()));
}
@Override
public void complete() {
latch.countDown();
}
});
rv.setOperation(op);
mconn.enqueueOperation(key, op);
if (op.isCancelled()) {
discardedOps++;
getLogger().debug("Silently discarding replica get for key \""
+ key + "\" (cancelled).");
} else {
replicaFuture.addFutureToMonitor(rv);