Search in sources :

Example 6 with FutureWrapper

use of com.google.appengine.api.utils.FutureWrapper in project appengine-java-standard by GoogleCloudPlatform.

the class AsyncDatastoreServiceImpl method allocateIdRange.

@Override
public Future<KeyRangeState> allocateIdRange(final KeyRange range) {
    Key parent = range.getParent();
    final String kind = range.getKind();
    final long start = range.getStart().getId();
    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, DatastoreService_3.Method.AllocateIds, req, resp);
    return new FutureWrapper<AllocateIdsResponse, KeyRangeState>(future) {

        @SuppressWarnings("deprecation")
        @Override
        protected KeyRangeState wrap(AllocateIdsResponse resp) throws Exception {
            // Check for collisions, i.e. existing entities with ids in this range.
            // 
            // We could do this before the allocation, but we'd still have to do it
            // afterward as well to catch the race condition where an entity is inserted
            // after that initial check but before the allocation. So, skip the up front
            // check and just do it once, here.
            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;
            }
            // Check for a race condition, i.e. cases where the datastore may have
            // cached id batches that contain ids in this range.
            boolean raceCondition = start < resp.getStart();
            return raceCondition ? KeyRangeState.CONTENTION : KeyRangeState.EMPTY;
        }

        @Override
        protected Throwable convertException(Throwable cause) {
            return cause;
        }
    };
}
Also used : FutureWrapper(com.google.appengine.api.utils.FutureWrapper) AllocateIdsResponse(com.google.apphosting.datastore.DatastoreV3Pb.AllocateIdsResponse) AllocateIdsRequest(com.google.apphosting.datastore.DatastoreV3Pb.AllocateIdsRequest)

Aggregations

FutureWrapper (com.google.appengine.api.utils.FutureWrapper)6 HTTPRequest (com.google.appengine.api.urlfetch.HTTPRequest)2 HTTPResponse (com.google.appengine.api.urlfetch.HTTPResponse)2 HTTPRequestInfo (com.google.appengine.tools.cloudstorage.oauth.URLFetchUtils.HTTPRequestInfo)2 ApiProxy (com.google.apphosting.api.ApiProxy)2 AllocateIdsRequest (com.google.apphosting.datastore.DatastoreV3Pb.AllocateIdsRequest)2 AllocateIdsResponse (com.google.apphosting.datastore.DatastoreV3Pb.AllocateIdsResponse)2 HTTPHeader (com.google.appengine.api.urlfetch.HTTPHeader)1 URLFetchResponse (com.google.appengine.api.urlfetch.URLFetchServicePb.URLFetchResponse)1 BadRangeException (com.google.appengine.tools.cloudstorage.BadRangeException)1 LogModuleVersion (com.google.apphosting.api.logservice.LogServicePb.LogModuleVersion)1 LogReadRequest (com.google.apphosting.api.logservice.LogServicePb.LogReadRequest)1 LogReadResponse (com.google.apphosting.api.logservice.LogServicePb.LogReadResponse)1 ErrorCode (com.google.apphosting.api.logservice.LogServicePb.LogServiceError.ErrorCode)1 ByteString (com.google.protobuf.ByteString)1 InvalidProtocolBufferException (com.google.protobuf.InvalidProtocolBufferException)1 UninitializedMessageException (com.google.protobuf.UninitializedMessageException)1 Reference (com.google.storage.onestore.v3.OnestoreEntity.Reference)1 FileNotFoundException (java.io.FileNotFoundException)1 SocketTimeoutException (java.net.SocketTimeoutException)1