long end = range.getEnd().getId();
AllocateIdsRequest req = new AllocateIdsRequest()
.setModelKey(AsyncDatastoreServiceImpl.buildAllocateIdsRef(parent, kind, null))
.setMax(end);
AllocateIdsResponse resp = new AllocateIdsResponse();
Future<AllocateIdsResponse> future = makeAsyncCall(apiConfig, Method.AllocateIds, req, resp);
return new FutureWrapper<AllocateIdsResponse, KeyRangeState>(future) {
@SuppressWarnings("deprecation")
@Override
protected KeyRangeState wrap(AllocateIdsResponse resp) throws Exception {
Query query = new Query(kind).setKeysOnly();
query.addFilter(
Entity.KEY_RESERVED_PROPERTY, FilterOperator.GREATER_THAN_OR_EQUAL, range.getStart());
query.addFilter(
Entity.KEY_RESERVED_PROPERTY, FilterOperator.LESS_THAN_OR_EQUAL, range.getEnd());
List<Entity> collision = prepare(query).asList(withLimit(1));
if (!collision.isEmpty()) {
return KeyRangeState.COLLISION;
}
boolean raceCondition = start < resp.getStart();
return raceCondition ? KeyRangeState.CONTENTION : KeyRangeState.EMPTY;
}
@Override
protected Throwable convertException(Throwable cause) {