@Override public RetryResult beforeEval(Exception exception) { if (exception instanceof DatastoreException) { DatastoreException e = getInnerException((DatastoreException) exception); if (e.getCode() == ABORTED_CODE || e.getReason() != null && e.getReason().equals("ABORTED")) { return Interceptor.RetryResult.RETRY; } } return Interceptor.RetryResult.CONTINUE_EVALUATION; }
/** Example of adding a single entity. */ // [TARGET add(FullEntity)] // [VARIABLE "my_key_name"] public void addSingleEntity(String keyName) { // [START addSingleEntity] Key key = datastore.newKeyFactory().setKind("MyKind").newKey(keyName); Entity.Builder entityBuilder = Entity.newBuilder(key); entityBuilder.set("propertyName", "value"); Entity entity = entityBuilder.build(); try { datastore.add(entity); } catch (DatastoreException ex) { if ("ALREADY_EXISTS".equals(ex.getReason())) { // entity.getKey() already exists } } // [END addSingleEntity] }
/** Example of adding multiple entities. */ // [TARGET add(FullEntity...)] // [VARIABLE "my_key_name1"] // [VARIABLE "my_key_name2"] public void batchAddEntities(String keyName1, String keyName2) { // [START batchAddEntities] Key key1 = datastore.newKeyFactory().setKind("MyKind").newKey(keyName1); Entity.Builder entityBuilder1 = Entity.newBuilder(key1); entityBuilder1.set("propertyName", "value1"); Entity entity1 = entityBuilder1.build(); Key key2 = datastore.newKeyFactory().setKind("MyKind").newKey(keyName2); Entity.Builder entityBuilder2 = Entity.newBuilder(key2); entityBuilder2.set("propertyName", "value2"); Entity entity2 = entityBuilder2.build(); try { datastore.add(entity1, entity2); } catch (DatastoreException ex) { if ("ALREADY_EXISTS".equals(ex.getReason())) { // at least one of entity1.getKey() and entity2.getKey() already exists } } // [END batchAddEntities] }
@Test public void testThrowInvalidRequest() throws Exception { try { DatastoreException.throwInvalidRequest("message %s %d", "a", 1); fail("Exception expected"); } catch (DatastoreException ex) { assertEquals("FAILED_PRECONDITION", ex.getReason()); assertEquals("message a 1", ex.getMessage()); } } }
@Test public void testNewTransactionCommit() { Transaction transaction = DATASTORE.newTransaction(); transaction.add(ENTITY3); Entity entity2 = Entity.newBuilder(ENTITY2).clear().setNull("bla").build(); transaction.update(entity2); transaction.delete(KEY1); transaction.commit(); assertFalse(transaction.isActive()); List<Entity> list = DATASTORE.fetch(KEY1, KEY2, KEY3); assertNull(list.get(0)); assertEquals(entity2, list.get(1)); assertEquals(ENTITY3, list.get(2)); assertEquals(3, list.size()); try { transaction.commit(); fail("Expecting a failure"); } catch (DatastoreException expected) { assertEquals("FAILED_PRECONDITION", expected.getReason()); } try { transaction.rollback(); fail("Expecting a failure"); } catch (DatastoreException expected) { assertEquals("FAILED_PRECONDITION", expected.getReason()); } }
@Test public void testNewTransactionRollback() { Transaction transaction = DATASTORE.newTransaction(); transaction.add(ENTITY3); Entity entity2 = Entity.newBuilder(ENTITY2) .clear() .setNull("bla") .set("list3", StringValue.of("bla"), StringValue.newBuilder("bla").build()) .build(); transaction.update(entity2); transaction.delete(KEY1); transaction.rollback(); transaction.rollback(); // should be safe to repeat rollback calls try { transaction.commit(); fail("Expecting a failure"); } catch (DatastoreException expected) { assertEquals("FAILED_PRECONDITION", expected.getReason()); } List<Entity> list = DATASTORE.fetch(KEY1, KEY2, KEY3); assertEquals(ENTITY1, list.get(0)); assertEquals(ENTITY2, list.get(1)); assertNull(list.get(2)); assertEquals(3, list.size()); }
DatastoreException exception = new DatastoreException(10, "message", "ABORTED"); assertEquals(10, exception.getCode()); assertEquals("ABORTED", exception.getReason()); assertEquals("message", exception.getMessage()); assertTrue(exception.isRetryable()); assertEquals("DEADLINE_EXCEEDED", exception.getReason()); assertEquals("message", exception.getMessage()); assertTrue(exception.isRetryable()); assertEquals("UNAVAILABLE", exception.getReason()); assertEquals("message", exception.getMessage()); assertTrue(exception.isRetryable()); assertEquals("INTERNAL", exception.getReason()); assertEquals("message", exception.getMessage()); assertFalse(exception.isRetryable()); exception = new DatastoreException(cause); assertEquals(DatastoreException.UNKNOWN_CODE, exception.getCode()); assertNull(exception.getReason()); assertEquals("socketTimeoutMessage", exception.getMessage()); assertEquals(cause, exception.getCause()); assertEquals("INTERNAL", exception.getReason()); assertEquals("message", exception.getMessage()); assertFalse(exception.isRetryable());
fail("Expecting a failure"); } catch (DatastoreException expected) { assertEquals("FAILED_PRECONDITION", expected.getReason());
@Test public void testTransactionWithRead() { Transaction transaction = datastore.newTransaction(); assertNull(transaction.get(KEY3)); transaction.add(ENTITY3); transaction.commit(); assertEquals(ENTITY3, datastore.get(KEY3)); transaction = datastore.newTransaction(); assertEquals(ENTITY3, transaction.get(KEY3)); // update entity3 during the transaction datastore.put(Entity.newBuilder(ENTITY3).clear().build()); transaction.update(ENTITY2); try { transaction.commit(); fail("Expecting a failure"); } catch (DatastoreException expected) { assertEquals("ABORTED", expected.getReason()); } }
@Test public void testTransactionWithRead() { Transaction transaction = DATASTORE.newTransaction(); assertNull(transaction.get(KEY3)); transaction.add(ENTITY3); transaction.commit(); assertEquals(ENTITY3, DATASTORE.get(KEY3)); transaction = DATASTORE.newTransaction(); assertEquals(ENTITY3, transaction.get(KEY3)); // update entity3 during the transaction DATASTORE.put(Entity.newBuilder(ENTITY2).clear().set("from", "datastore").build()); transaction.update(Entity.newBuilder(ENTITY2).clear().set("from", "transaction").build()); try { transaction.commit(); fail("Expecting a failure"); } catch (DatastoreException expected) { assertEquals("ABORTED", expected.getReason()); } }
@Test public void testTransactionWithQuery() { Query<Entity> query = Query.newEntityQueryBuilder() .setKind(KIND2) .setFilter(PropertyFilter.hasAncestor(KEY2)) .build(); Transaction transaction = datastore.newTransaction(); QueryResults<Entity> results = transaction.run(query); assertEquals(ENTITY2, results.next()); assertFalse(results.hasNext()); transaction.add(ENTITY3); transaction.commit(); assertEquals(ENTITY3, datastore.get(KEY3)); transaction = datastore.newTransaction(); results = transaction.run(query); assertEquals(ENTITY2, results.next()); transaction.delete(ENTITY3.getKey()); // update entity2 during the transaction datastore.put(Entity.newBuilder(ENTITY2).clear().build()); try { transaction.commit(); fail("Expecting a failure"); } catch (DatastoreException expected) { assertEquals("ABORTED", expected.getReason()); } }
fail("Expecting a failure"); } catch (DatastoreException expected) { assertEquals("ABORTED", expected.getReason());
@Override public RetryResult beforeEval(Exception exception) { if (exception instanceof DatastoreException) { DatastoreException e = getInnerException((DatastoreException) exception); if (e.getCode() == ABORTED_CODE || e.getReason() != null && e.getReason().equals("ABORTED")) { return Interceptor.RetryResult.RETRY; } } return Interceptor.RetryResult.CONTINUE_EVALUATION; }
public boolean isAlreadyExists() { if (getCause() != null && getCause() instanceof DatastoreException) { DatastoreException datastoreException = (DatastoreException) getCause(); // TODO remove check on message when Google fixes the Datastore emulator return "ALREADY_EXISTS".equals(datastoreException.getReason()) || messageStartsWith("entity already exists"); } else { return false; } }
public boolean isNotFound() { if (getCause() != null && getCause() instanceof DatastoreException) { DatastoreException datastoreException = (DatastoreException) getCause(); // TODO remove check on message when Google fixes the Datastore emulator return "NOT_FOUND".equals(datastoreException.getReason()) || messageStartsWith("no entity to update"); } else { return false; } }