use of com.google.cloud.spanner.AsyncTransactionManager.TransactionContextFuture in project java-spanner by googleapis.
the class AsyncTransactionManagerTest method asyncTransactionManagerRead.
@Test
public void asyncTransactionManagerRead() throws Exception {
try (AsyncTransactionManager manager = client().transactionManagerAsync()) {
TransactionContextFuture transactionContextFuture = manager.beginAsync();
while (true) {
try {
AsyncTransactionStep<Void, List<String>> values = transactionContextFuture.then((transactionContext, ignored) -> transactionContext.readAsync(READ_TABLE_NAME, KeySet.all(), READ_COLUMN_NAMES).toListAsync(input -> input.getString("Value"), MoreExecutors.directExecutor()), executor);
// Commit the transaction.
values.commitAsync().get();
assertThat(values.get()).containsExactly("v1", "v2", "v3");
break;
} catch (AbortedException e) {
transactionContextFuture = manager.resetForRetryAsync();
}
}
}
}
use of com.google.cloud.spanner.AsyncTransactionManager.TransactionContextFuture in project java-spanner by googleapis.
the class DatabaseClientImplTest method testAsyncTransactionManagerCommitWithTag.
@Test
public void testAsyncTransactionManagerCommitWithTag() {
DatabaseClient client = spanner.getDatabaseClient(DatabaseId.of(TEST_PROJECT, TEST_INSTANCE, TEST_DATABASE));
try (AsyncTransactionManager manager = client.transactionManagerAsync(Options.tag("app=spanner,env=test,action=manager"))) {
TransactionContextFuture transaction = manager.beginAsync();
get(transaction.then((txn, input) -> {
txn.buffer(Mutation.delete("TEST", KeySet.all()));
return ApiFutures.immediateFuture(null);
}, executor).commitAsync());
}
List<CommitRequest> requests = mockSpanner.getRequestsOfType(CommitRequest.class);
assertThat(requests).hasSize(1);
CommitRequest request = requests.get(0);
assertNotNull(request.getRequestOptions());
assertThat(request.getRequestOptions().getRequestTag()).isEmpty();
assertThat(request.getRequestOptions().getTransactionTag()).isEqualTo("app=spanner,env=test,action=manager");
}
use of com.google.cloud.spanner.AsyncTransactionManager.TransactionContextFuture in project java-spanner by googleapis.
the class RetryOnInvalidatedSessionTest method asyncTransactionManager_readSync.
private void asyncTransactionManager_readSync(final Function<TransactionContext, ResultSet> fn) throws InterruptedException {
final ExecutorService queryExecutor = Executors.newSingleThreadExecutor();
try (AsyncTransactionManager manager = client.transactionManagerAsync()) {
TransactionContextFuture context = manager.beginAsync();
while (true) {
try {
AsyncTransactionStep<Void, Long> count = context.then((transaction, ignored) -> {
long counter = 0L;
try (ResultSet rs = fn.apply(transaction)) {
while (rs.next()) {
counter++;
}
}
return ApiFutures.immediateFuture(counter);
}, executor);
CommitTimestampFuture ts = count.commitAsync();
assertThrowsSessionNotFoundIfShouldFail(() -> get(ts));
break;
} catch (AbortedException e) {
context = manager.resetForRetryAsync();
}
}
} finally {
queryExecutor.shutdown();
}
}
use of com.google.cloud.spanner.AsyncTransactionManager.TransactionContextFuture in project java-spanner by googleapis.
the class RetryOnInvalidatedSessionTest method asyncTransactionManager_updateFunction.
private <T> void asyncTransactionManager_updateFunction(final Function<TransactionContext, ApiFuture<T>> fn, T expected) throws InterruptedException {
try (AsyncTransactionManager manager = client.transactionManagerAsync()) {
TransactionContextFuture transaction = manager.beginAsync();
while (true) {
try {
AsyncTransactionStep<Void, T> res = transaction.then((txn, input) -> fn.apply(txn), executor);
CommitTimestampFuture ts = res.commitAsync();
assertThrowsSessionNotFoundIfShouldFail(() -> get(ts));
break;
} catch (AbortedException e) {
transaction = manager.resetForRetryAsync();
}
}
}
}
use of com.google.cloud.spanner.AsyncTransactionManager.TransactionContextFuture in project java-spanner by googleapis.
the class ITTransactionManagerAsyncTest method testInvalidInsert.
@Test
public void testInvalidInsert() throws InterruptedException {
try (AsyncTransactionManager manager = client.transactionManagerAsync()) {
TransactionContextFuture txn = manager.beginAsync();
while (true) {
try {
txn.then((transaction, ignored) -> {
transaction.buffer(Mutation.newInsertBuilder("InvalidTable").set("K").to("Key1").set("BoolValue").to(true).build());
return ApiFutures.immediateFuture(null);
}, executor).commitAsync().get();
fail("Expected exception");
} catch (AbortedException e) {
Thread.sleep(e.getRetryDelayInMillis());
txn = manager.resetForRetryAsync();
} catch (ExecutionException e) {
assertThat(e.getCause()).isInstanceOf(SpannerException.class);
SpannerException se = (SpannerException) e.getCause();
assertThat(se.getErrorCode()).isEqualTo(ErrorCode.NOT_FOUND);
// expected
break;
}
}
assertThat(manager.getState()).isEqualTo(TransactionState.COMMIT_FAILED);
// We cannot retry for non aborted errors.
try {
manager.resetForRetryAsync();
fail("Expected exception");
} catch (IllegalStateException ex) {
assertNotNull(ex.getMessage());
}
}
}
Aggregations