throws ExecutionException, InterruptedException, TimeoutException {
while (true) {
List<EntityV4.Key> deferredKeys = Lists.newArrayList();
for (Future<LookupResponse> currentFuture : currentFutures) {
LookupResponse resp = getFutureWithOptionalTimeout(currentFuture, timeout, timeoutUnit);
addEntitiesToResultMap(resp);
deferredKeys.addAll(resp.getDeferredList());
}
if (deferredKeys.isEmpty()) {
break;
}