Search in sources :

Example 1 with MemcacheDeleteRequest

use of com.google.appengine.api.memcache.MemcacheServicePb.MemcacheDeleteRequest in project appengine-java-standard by GoogleCloudPlatform.

the class LocalMemcacheService method delete.

@LatencyPercentiles(latency50th = 4)
public MemcacheDeleteResponse delete(Status status, MemcacheDeleteRequest req) {
    MemcacheDeleteResponse.Builder result = MemcacheDeleteResponse.newBuilder();
    final String namespace = req.getNameSpace();
    for (int i = 0; i < req.getItemCount(); i++) {
        MemcacheDeleteRequest.Item item = req.getItem(i);
        Key key = new Key(item.getKey().toByteArray());
        CacheEntry ce = internalDelete(namespace, key);
        result.addDeleteStatus(ce == null ? DeleteStatusCode.NOT_FOUND : DeleteStatusCode.DELETED);
        if (ce != null) {
            stats.recordDelete(ce);
        }
        // open spec whether this happens if there was no deletion
        if (item.hasDeleteTime()) {
            int millisNoReAdd = item.getDeleteTime() * 1000;
            getOrMakeSubMap(deleteHold, namespace).put(key, clock.getCurrentTime() + millisNoReAdd);
        }
    }
    status.setSuccessful(true);
    return result.build();
}
Also used : MemcacheDeleteResponse(com.google.appengine.api.memcache.MemcacheServicePb.MemcacheDeleteResponse) MemcacheDeleteRequest(com.google.appengine.api.memcache.MemcacheServicePb.MemcacheDeleteRequest) ByteString(com.google.protobuf.ByteString) LatencyPercentiles(com.google.appengine.tools.development.LatencyPercentiles)

Example 2 with MemcacheDeleteRequest

use of com.google.appengine.api.memcache.MemcacheServicePb.MemcacheDeleteRequest in project appengine-java-standard by GoogleCloudPlatform.

the class MemcacheServiceImplTest method oneDeleteTest.

private void oneDeleteTest(MemcacheService memcache, String namespace, int timeoutMillis) {
    String[] keys = { ONE, null };
    for (String key : keys) {
        MemcacheDeleteRequest request = MemcacheDeleteRequest.newBuilder().setNameSpace(namespace).addItem(MemcacheDeleteRequest.Item.newBuilder().setKey(ByteString.copyFrom(makePbKey(key))).setDeleteTime(timeoutMillis / 1000)).build();
        MemcacheDeleteResponse response;
        if (timeoutMillis == 0) {
            response = MemcacheDeleteResponse.newBuilder().addDeleteStatus(MemcacheDeleteResponse.DeleteStatusCode.DELETED).build();
        } else {
            response = MemcacheDeleteResponse.newBuilder().addDeleteStatus(MemcacheDeleteResponse.DeleteStatusCode.NOT_FOUND).build();
        }
        expectAsyncCall("Delete", request, response);
        if (timeoutMillis == 0) {
            assertThat(memcache.delete(key)).isTrue();
        } else {
            assertThat(memcache.delete(key, timeoutMillis)).isFalse();
        }
        verifyAsyncCall("Delete", request);
    }
}
Also used : MemcacheDeleteResponse(com.google.appengine.api.memcache.MemcacheServicePb.MemcacheDeleteResponse) MemcacheDeleteRequest(com.google.appengine.api.memcache.MemcacheServicePb.MemcacheDeleteRequest) ByteString(com.google.protobuf.ByteString)

Example 3 with MemcacheDeleteRequest

use of com.google.appengine.api.memcache.MemcacheServicePb.MemcacheDeleteRequest in project appengine-java-standard by GoogleCloudPlatform.

the class MemcacheServiceImplTest method errorHandlingPermissiveTest.

private void errorHandlingPermissiveTest(boolean isConsistent, ErrorHandler errorHandler) {
    byte[] oneKey = makePbKey(ONE);
    byte[] oneValue = serialize(ONE).value;
    MemcacheService memcache = new MemcacheServiceImpl("");
    memcache.setErrorHandler(errorHandler);
    // Get calls
    MemcacheGetRequest getRequest = MemcacheGetRequest.newBuilder().setNameSpace("").addKey(ByteString.copyFrom(oneKey)).build();
    expectAsyncCall("Get", getRequest, new ApiProxy.ApplicationException(1, "Error"));
    Object value = memcache.get(ONE);
    assertThat(value).isNull();
    verifyAsyncCall("Get", getRequest);
    expectAsyncCall("Get", getRequest, new ApiProxy.ApplicationException(1, "Error"));
    assertThat(memcache.contains(ONE)).isFalse();
    verifyAsyncCall("Get", getRequest);
    expectAsyncCall("Get", getRequest, new byte[] { 10, 20 });
    assertThat(memcache.get(ONE)).isNull();
    verifyAsyncCall("Get", getRequest);
    // Set calls
    MemcacheSetRequest setRequest = MemcacheSetRequest.newBuilder().setNameSpace("").addItem(MemcacheSetRequest.Item.newBuilder().setKey(ByteString.copyFrom(oneKey)).setFlags(Flag.UTF8.ordinal()).setValue(ByteString.copyFrom(oneValue)).setSetPolicy(MemcacheSetRequest.SetPolicy.ADD).setExpirationTime(0)).build();
    // Because of AllowPartialResults for Set method, Set should almost always succeed and return
    // any error code in the response payload. Application error can occur only for early checks,
    // e.g. out of quota, ShardLock check failure or missing ServingState.
    expectAsyncCall("Set", setRequest, new ApiProxy.ApplicationException(1, "Error"));
    assertThat(memcache.put(ONE, "one", null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT)).isFalse();
    verifyAsyncCall("Set", setRequest);
    expectAsyncCall("Set", setRequest, new ApiProxy.ApplicationException(1, "Error"));
    assertThat(memcache.putAll(ImmutableMap.of(ONE, "one"), null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT)).isEmpty();
    verifyAsyncCall("Set", setRequest);
    // Successful set -> no error logged or exception thrown.
    expectAsyncCall("Set", setRequest, MemcacheSetResponse.newBuilder().addSetStatus(SetStatusCode.STORED).build());
    assertThat(memcache.put(ONE, "one", null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT)).isTrue();
    verifyAsyncCall("Set", setRequest);
    expectAsyncCall("Set", setRequest, MemcacheSetResponse.newBuilder().addSetStatus(SetStatusCode.STORED).build());
    assertThat(memcache.putAll(ImmutableMap.of(ONE, "one"), null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT)).isEqualTo(ImmutableSet.of(ONE));
    verifyAsyncCall("Set", setRequest);
    // Item not stored because of set policy -> logs an error or throws, depending on the error
    // handler used (for backwards compatibility).
    expectAsyncCall("Set", setRequest, MemcacheSetResponse.newBuilder().addSetStatus(SetStatusCode.ERROR).build());
    if (isConsistent) {
        assertThat(memcache.put(ONE, "one", null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT)).isFalse();
    } else {
        assertThrows(MemcacheServiceException.class, () -> memcache.put(ONE, "one", null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT));
    }
    verifyAsyncCall("Set", setRequest);
    expectAsyncCall("Set", setRequest, MemcacheSetResponse.newBuilder().addSetStatus(SetStatusCode.ERROR).build());
    if (isConsistent) {
        assertThat(memcache.putAll(ImmutableMap.of(ONE, "one"), null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT)).isEmpty();
    } else {
        assertThrows(MemcacheServiceException.class, () -> memcache.putAll(ImmutableMap.of(ONE, "one"), null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT));
    }
    verifyAsyncCall("Set", setRequest);
    // Increment calls
    MemcacheIncrementRequest incrementRequest = MemcacheIncrementRequest.newBuilder().setNameSpace("").setKey(ByteString.copyFrom(makePbKey(INT_123))).setDelta(17).setDirection(MemcacheIncrementRequest.Direction.DECREMENT).build();
    expectAsyncCall("Increment", incrementRequest, new ApiProxy.ApplicationException(1, "Error"));
    assertThat(memcache.increment(INT_123, -17)).isEqualTo(null);
    verifyAsyncCall("Increment", incrementRequest);
    expectAsyncCall("Increment", incrementRequest, new ApiProxy.ApplicationException(6, "Error"));
    assertThrows(InvalidValueException.class, () -> memcache.increment(INT_123, -17));
    verifyAsyncCall("Increment", incrementRequest);
    // BatchIncrement calls
    MemcacheBatchIncrementRequest batchIncrementRequest = MemcacheBatchIncrementRequest.newBuilder().setNameSpace("").addItem(MemcacheIncrementRequest.newBuilder().setKey(ByteString.copyFrom(makePbKey(INT_123))).setDelta(17).setDirection(MemcacheIncrementRequest.Direction.DECREMENT)).build();
    expectAsyncCall("BatchIncrement", batchIncrementRequest, new ApiProxy.ApplicationException(1, "Error"));
    assertThat(memcache.incrementAll(Arrays.asList(INT_123), -17)).isEqualTo(Collections.singletonMap(INT_123, null));
    verifyAsyncCall("BatchIncrement", batchIncrementRequest);
    expectAsyncCall("BatchIncrement", batchIncrementRequest, MemcacheBatchIncrementResponse.newBuilder().addItem(MemcacheIncrementResponse.newBuilder().setIncrementStatus(IncrementStatusCode.ERROR)).build());
    assertThat(memcache.incrementAll(Arrays.asList(INT_123), -17)).isEqualTo(Collections.singletonMap(INT_123, null));
    verifyAsyncCall("BatchIncrement", batchIncrementRequest);
    // Delete calls
    MemcacheDeleteRequest deleteRequest = MemcacheDeleteRequest.newBuilder().setNameSpace("").addItem(MemcacheDeleteRequest.Item.newBuilder().setKey(ByteString.copyFrom(oneKey)).setDeleteTime(0)).build();
    expectAsyncCall("Delete", deleteRequest, new ApiProxy.ApplicationException(1, "Error"));
    assertThat(memcache.delete(ONE)).isFalse();
    verifyAsyncCall("Delete", deleteRequest);
    expectAsyncCall("Delete", deleteRequest, new ApiProxy.ApplicationException(1, "Error"));
    assertThat(memcache.deleteAll(Arrays.asList(ONE))).isEmpty();
    verifyAsyncCall("Delete", deleteRequest);
    // Flush calls
    MemcacheFlushRequest flushRequest = MemcacheFlushRequest.getDefaultInstance();
    expectAsyncCall("FlushAll", flushRequest, new ApiProxy.ApplicationException(1, "Error"));
    memcache.clearAll();
    verifyAsyncCall("FlushAll", flushRequest);
}
Also used : MemcacheDeleteRequest(com.google.appengine.api.memcache.MemcacheServicePb.MemcacheDeleteRequest) ApiProxy(com.google.apphosting.api.ApiProxy) MemcacheGetRequest(com.google.appengine.api.memcache.MemcacheServicePb.MemcacheGetRequest) MemcacheFlushRequest(com.google.appengine.api.memcache.MemcacheServicePb.MemcacheFlushRequest) MemcacheIncrementRequest(com.google.appengine.api.memcache.MemcacheServicePb.MemcacheIncrementRequest) MemcacheBatchIncrementRequest(com.google.appengine.api.memcache.MemcacheServicePb.MemcacheBatchIncrementRequest) MemcacheSetRequest(com.google.appengine.api.memcache.MemcacheServicePb.MemcacheSetRequest)

Example 4 with MemcacheDeleteRequest

use of com.google.appengine.api.memcache.MemcacheServicePb.MemcacheDeleteRequest in project appengine-java-standard by GoogleCloudPlatform.

the class MemcacheServiceImplTest method testErrorHandlingStrict.

@Test
public void testErrorHandlingStrict() {
    byte[] oneKey = makePbKey(ONE);
    byte[] oneValue = serialize(ONE).value;
    MemcacheService memcache = new MemcacheServiceImpl("");
    memcache.setErrorHandler(ErrorHandlers.getStrict());
    MemcacheGetRequest getRequest = MemcacheGetRequest.newBuilder().setNameSpace("").addKey(ByteString.copyFrom(oneKey)).build();
    expectAsyncCall("Get", getRequest, new ApiProxy.ApplicationException(1, "Error"));
    assertThrows(MemcacheServiceException.class, () -> memcache.get(ONE));
    verifyAsyncCall("Get", getRequest);
    expectAsyncCall("Get", getRequest, new ApiProxy.ApplicationException(1, "Error"));
    assertThrows(MemcacheServiceException.class, () -> memcache.contains(ONE));
    verifyAsyncCall("Get", getRequest);
    MemcacheSetRequest setRequest = MemcacheSetRequest.newBuilder().setNameSpace("").addItem(MemcacheSetRequest.Item.newBuilder().setKey(ByteString.copyFrom(oneKey)).setFlags(Flag.UTF8.ordinal()).setValue(ByteString.copyFrom(oneValue)).setSetPolicy(MemcacheSetRequest.SetPolicy.ADD).setExpirationTime(0)).build();
    expectAsyncCall("Set", setRequest, new ApiProxy.ApplicationException(1, "Error"));
    assertThrows(MemcacheServiceException.class, () -> memcache.put(ONE, "one", null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT));
    verifyAsyncCall("Set", setRequest);
    expectAsyncCall("Set", setRequest, new ApiProxy.ApplicationException(1, "Error"));
    assertThrows(MemcacheServiceException.class, () -> memcache.putAll(ImmutableMap.of(ONE, "one"), null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT));
    verifyAsyncCall("Set", setRequest);
    // Successful set -> no error logged or exception thrown.
    expectAsyncCall("Set", setRequest, MemcacheSetResponse.newBuilder().addSetStatus(SetStatusCode.STORED).build());
    assertThat(memcache.put(ONE, "one", null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT)).isTrue();
    verifyAsyncCall("Set", setRequest);
    expectAsyncCall("Set", setRequest, MemcacheSetResponse.newBuilder().addSetStatus(SetStatusCode.STORED).build());
    assertThat(memcache.putAll(ImmutableMap.of(ONE, "one"), null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT)).isEqualTo(ImmutableSet.of(ONE));
    verifyAsyncCall("Set", setRequest);
    // Item not stored because of set policy.
    expectAsyncCall("Set", setRequest, MemcacheSetResponse.newBuilder().addSetStatus(SetStatusCode.ERROR).build());
    assertThrows(MemcacheServiceException.class, () -> memcache.put(ONE, "one", null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT));
    verifyAsyncCall("Set", setRequest);
    expectAsyncCall("Set", setRequest, MemcacheSetResponse.newBuilder().addSetStatus(SetStatusCode.ERROR).build());
    assertThrows(MemcacheServiceException.class, () -> memcache.putAll(ImmutableMap.of(ONE, "one"), null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT));
    verifyAsyncCall("Set", setRequest);
    MemcacheIncrementRequest incrementRequest = MemcacheIncrementRequest.newBuilder().setNameSpace("").setKey(ByteString.copyFrom(makePbKey(INT_123))).setDelta(17).setDirection(MemcacheIncrementRequest.Direction.DECREMENT).build();
    expectAsyncCall("Increment", incrementRequest, new ApiProxy.ApplicationException(1, "Error"));
    assertThrows(MemcacheServiceException.class, () -> memcache.increment(INT_123, -17));
    verifyAsyncCall("Increment", incrementRequest);
    expectAsyncCall("Increment", incrementRequest, new ApiProxy.ApplicationException(6, "Error"));
    assertThrows(InvalidValueException.class, () -> memcache.increment(INT_123, -17));
    verifyAsyncCall("Increment", incrementRequest);
    MemcacheBatchIncrementRequest batchIncrementRequest = MemcacheBatchIncrementRequest.newBuilder().setNameSpace("").addItem(MemcacheIncrementRequest.newBuilder().setKey(ByteString.copyFrom(makePbKey(INT_123))).setDelta(17).setDirection(MemcacheIncrementRequest.Direction.DECREMENT)).build();
    expectAsyncCall("BatchIncrement", batchIncrementRequest, new ApiProxy.ApplicationException(1, "Error"));
    assertThrows(MemcacheServiceException.class, () -> memcache.incrementAll(Arrays.asList(INT_123), -17));
    verifyAsyncCall("BatchIncrement", batchIncrementRequest);
    // Partial BatchIncrement error doesn't throw, but returns null.
    expectAsyncCall("BatchIncrement", batchIncrementRequest, MemcacheBatchIncrementResponse.newBuilder().addItem(MemcacheIncrementResponse.newBuilder().setIncrementStatus(IncrementStatusCode.ERROR)).build());
    assertThat(memcache.incrementAll(Arrays.asList(INT_123), -17)).containsExactly(INT_123, null);
    MemcacheDeleteRequest deleteRequest = MemcacheDeleteRequest.newBuilder().setNameSpace("").addItem(MemcacheDeleteRequest.Item.newBuilder().setKey(ByteString.copyFrom(oneKey)).setDeleteTime(0)).build();
    expectAsyncCall("Delete", deleteRequest, new ApiProxy.ApplicationException(1, "Error"));
    assertThrows(MemcacheServiceException.class, () -> memcache.delete(ONE));
    verifyAsyncCall("Delete", deleteRequest);
    expectAsyncCall("Delete", deleteRequest, new ApiProxy.ApplicationException(1, "Error"));
    assertThrows(MemcacheServiceException.class, () -> memcache.deleteAll(Arrays.asList(ONE)));
    verifyAsyncCall("Delete", deleteRequest);
    MemcacheFlushRequest flushRequest = MemcacheFlushRequest.getDefaultInstance();
    expectAsyncCall("FlushAll", flushRequest, new ApiProxy.ApplicationException(1, "Error"));
    assertThrows(MemcacheServiceException.class, memcache::clearAll);
    verifyAsyncCall("FlushAll", flushRequest);
}
Also used : MemcacheDeleteRequest(com.google.appengine.api.memcache.MemcacheServicePb.MemcacheDeleteRequest) ApiProxy(com.google.apphosting.api.ApiProxy) MemcacheGetRequest(com.google.appengine.api.memcache.MemcacheServicePb.MemcacheGetRequest) MemcacheFlushRequest(com.google.appengine.api.memcache.MemcacheServicePb.MemcacheFlushRequest) MemcacheIncrementRequest(com.google.appengine.api.memcache.MemcacheServicePb.MemcacheIncrementRequest) MemcacheBatchIncrementRequest(com.google.appengine.api.memcache.MemcacheServicePb.MemcacheBatchIncrementRequest) MemcacheSetRequest(com.google.appengine.api.memcache.MemcacheServicePb.MemcacheSetRequest) Test(org.junit.Test)

Example 5 with MemcacheDeleteRequest

use of com.google.appengine.api.memcache.MemcacheServicePb.MemcacheDeleteRequest in project appengine-java-standard by GoogleCloudPlatform.

the class MemcacheServiceImplTest method multiDeleteTest.

private void multiDeleteTest(MemcacheService memcache, String namespace, int timeoutMillis) {
    MemcacheDeleteRequest request = MemcacheDeleteRequest.newBuilder().setNameSpace(namespace).addItem(MemcacheDeleteRequest.Item.newBuilder().setKey(ByteString.copyFrom(makePbKey(ONE))).setDeleteTime(timeoutMillis / 1000)).addItem(MemcacheDeleteRequest.Item.newBuilder().setKey(ByteString.copyFrom(makePbKey(null))).setDeleteTime(timeoutMillis / 1000)).build();
    MemcacheDeleteResponse response;
    if (timeoutMillis == 0) {
        response = MemcacheDeleteResponse.newBuilder().addDeleteStatus(MemcacheDeleteResponse.DeleteStatusCode.NOT_FOUND).addDeleteStatus(MemcacheDeleteResponse.DeleteStatusCode.DELETED).build();
    } else {
        response = MemcacheDeleteResponse.newBuilder().addDeleteStatus(MemcacheDeleteResponse.DeleteStatusCode.DELETED).addDeleteStatus(MemcacheDeleteResponse.DeleteStatusCode.NOT_FOUND).build();
    }
    expectAsyncCall("Delete", request, response);
    ArrayList<String> collection = new ArrayList<>();
    collection.add(ONE);
    collection.add(null);
    if (timeoutMillis == 0) {
        Set<String> resp = memcache.deleteAll(collection);
        assertThat(resp).hasSize(1);
        assertThat(resp).contains(null);
    } else {
        Set<String> resp = memcache.deleteAll(collection, timeoutMillis);
        assertThat(resp).hasSize(1);
        assertThat(resp).contains(ONE);
    }
    verifyAsyncCall("Delete", request);
}
Also used : MemcacheDeleteResponse(com.google.appengine.api.memcache.MemcacheServicePb.MemcacheDeleteResponse) MemcacheDeleteRequest(com.google.appengine.api.memcache.MemcacheServicePb.MemcacheDeleteRequest) ArrayList(java.util.ArrayList) ByteString(com.google.protobuf.ByteString)

Aggregations

MemcacheDeleteRequest (com.google.appengine.api.memcache.MemcacheServicePb.MemcacheDeleteRequest)5 MemcacheDeleteResponse (com.google.appengine.api.memcache.MemcacheServicePb.MemcacheDeleteResponse)3 ByteString (com.google.protobuf.ByteString)3 MemcacheBatchIncrementRequest (com.google.appengine.api.memcache.MemcacheServicePb.MemcacheBatchIncrementRequest)2 MemcacheFlushRequest (com.google.appengine.api.memcache.MemcacheServicePb.MemcacheFlushRequest)2 MemcacheGetRequest (com.google.appengine.api.memcache.MemcacheServicePb.MemcacheGetRequest)2 MemcacheIncrementRequest (com.google.appengine.api.memcache.MemcacheServicePb.MemcacheIncrementRequest)2 MemcacheSetRequest (com.google.appengine.api.memcache.MemcacheServicePb.MemcacheSetRequest)2 ApiProxy (com.google.apphosting.api.ApiProxy)2 LatencyPercentiles (com.google.appengine.tools.development.LatencyPercentiles)1 ArrayList (java.util.ArrayList)1 Test (org.junit.Test)1