use of com.google.cloud.bigtable.data.v2.models.MutateRowsException.FailedMutation in project java-bigtable by googleapis.
the class MutateRowsAttemptCallableTest method mixedTest.
@Test
public void mixedTest() {
// Setup the request & response
MutateRowsRequest request = MutateRowsRequest.newBuilder().addEntries(Entry.getDefaultInstance()).addEntries(Entry.getDefaultInstance()).addEntries(Entry.getDefaultInstance()).build();
innerCallable.response.add(MutateRowsResponse.newBuilder().addEntries(MutateRowsResponse.Entry.newBuilder().setIndex(0).setStatus(OK_STATUS_PROTO)).addEntries(MutateRowsResponse.Entry.newBuilder().setIndex(1).setStatus(TRANSIENT_ERROR_STATUS_PROTO)).addEntries(MutateRowsResponse.Entry.newBuilder().setIndex(2).setStatus(PERMENANT_ERROR_STATUS_PROTO)).build());
MutateRowsAttemptCallable attemptCallable = new MutateRowsAttemptCallable(innerCallable, request, callContext, retryCodes);
attemptCallable.setExternalFuture(parentFuture);
// Make the only call
attemptCallable.call();
// Overall error expectations
Throwable actualError = null;
try {
parentFuture.attemptFuture.get();
} catch (Throwable t) {
actualError = t.getCause();
}
assertThat(actualError).isInstanceOf(MutateRowsException.class);
assertThat(((MutateRowsException) actualError).isRetryable()).isTrue();
// Entry expectations
@SuppressWarnings("ConstantConditions") List<FailedMutation> failedMutations = ((MutateRowsException) actualError).getFailedMutations();
assertThat(failedMutations).hasSize(2);
assertThat(failedMutations.get(0).getIndex()).isEqualTo(1);
assertThat(failedMutations.get(0).getError().getStatusCode().getCode()).isEqualTo(Code.UNAVAILABLE);
assertThat(failedMutations.get(0).getError().isRetryable()).isTrue();
assertThat(failedMutations.get(1).getIndex()).isEqualTo(2);
assertThat(failedMutations.get(1).getError().getStatusCode().getCode()).isEqualTo(Code.INVALID_ARGUMENT);
assertThat(failedMutations.get(1).getError().isRetryable()).isFalse();
}
use of com.google.cloud.bigtable.data.v2.models.MutateRowsException.FailedMutation in project java-bigtable by googleapis.
the class MutateRowsAttemptCallableTest method rpcPermanentError.
@Test
public void rpcPermanentError() {
// Setup the request & response
MutateRowsRequest request = MutateRowsRequest.newBuilder().addEntries(Entry.getDefaultInstance()).addEntries(Entry.getDefaultInstance()).build();
final UnavailableException rpcError = new UnavailableException("fake error", null, GrpcStatusCode.of(io.grpc.Status.Code.INVALID_ARGUMENT), false);
UnaryCallable<MutateRowsRequest, List<MutateRowsResponse>> innerCallable = new UnaryCallable<MutateRowsRequest, List<MutateRowsResponse>>() {
@Override
public ApiFuture<List<MutateRowsResponse>> futureCall(MutateRowsRequest request, ApiCallContext context) {
return ApiFutures.immediateFailedFuture(rpcError);
}
};
// Make the call
MutateRowsAttemptCallable attemptCallable = new MutateRowsAttemptCallable(innerCallable, request, callContext, retryCodes);
attemptCallable.setExternalFuture(parentFuture);
attemptCallable.call();
// Overall expectations: retryable error
Throwable actualError = null;
try {
parentFuture.attemptFuture.get();
} catch (Throwable t) {
actualError = t.getCause();
}
assertThat(actualError).isInstanceOf(MutateRowsException.class);
assertThat(((MutateRowsException) actualError).isRetryable()).isFalse();
// Entry expectations: both entries failed with an error whose cause is the rpc error
@SuppressWarnings("ConstantConditions") List<FailedMutation> failedMutations = ((MutateRowsException) actualError).getFailedMutations();
assertThat(failedMutations).hasSize(2);
assertThat(failedMutations.get(0).getIndex()).isEqualTo(0);
assertThat(failedMutations.get(0).getError().isRetryable()).isFalse();
assertThat(failedMutations.get(0).getError().getCause()).isEqualTo(rpcError);
assertThat(failedMutations.get(1).getIndex()).isEqualTo(1);
assertThat(failedMutations.get(1).getError().isRetryable()).isFalse();
assertThat(failedMutations.get(1).getError().getCause()).isEqualTo(rpcError);
}
use of com.google.cloud.bigtable.data.v2.models.MutateRowsException.FailedMutation in project java-bigtable by googleapis.
the class MutateRowsAttemptCallableTest method rpcRetryableError.
@Test
public void rpcRetryableError() {
// Setup the request & response
MutateRowsRequest request = MutateRowsRequest.newBuilder().addEntries(Entry.getDefaultInstance()).addEntries(Entry.getDefaultInstance()).build();
final UnavailableException rpcError = new UnavailableException("fake error", null, GrpcStatusCode.of(io.grpc.Status.Code.UNAVAILABLE), true);
UnaryCallable<MutateRowsRequest, List<MutateRowsResponse>> innerCallable = new UnaryCallable<MutateRowsRequest, List<MutateRowsResponse>>() {
@Override
public ApiFuture<List<MutateRowsResponse>> futureCall(MutateRowsRequest request, ApiCallContext context) {
return ApiFutures.immediateFailedFuture(rpcError);
}
};
// Make the call
MutateRowsAttemptCallable attemptCallable = new MutateRowsAttemptCallable(innerCallable, request, callContext, retryCodes);
attemptCallable.setExternalFuture(parentFuture);
attemptCallable.call();
// Overall expectations: retryable error
Throwable actualError = null;
try {
parentFuture.attemptFuture.get();
} catch (Throwable t) {
actualError = t.getCause();
}
assertThat(actualError).isInstanceOf(MutateRowsException.class);
assertThat(((MutateRowsException) actualError).isRetryable()).isTrue();
// Entry expectations: both entries failed with an error whose cause is the rpc error
@SuppressWarnings("ConstantConditions") List<FailedMutation> failedMutations = ((MutateRowsException) actualError).getFailedMutations();
assertThat(failedMutations).hasSize(2);
assertThat(failedMutations.get(0).getIndex()).isEqualTo(0);
assertThat(failedMutations.get(0).getError().isRetryable()).isTrue();
assertThat(failedMutations.get(0).getError().getCause()).isEqualTo(rpcError);
assertThat(failedMutations.get(1).getIndex()).isEqualTo(1);
assertThat(failedMutations.get(1).getError().isRetryable()).isTrue();
assertThat(failedMutations.get(1).getError().getCause()).isEqualTo(rpcError);
}
use of com.google.cloud.bigtable.data.v2.models.MutateRowsException.FailedMutation in project java-bigtable by googleapis.
the class MutateRowsAttemptCallableTest method nextAttemptTest.
@Test
public void nextAttemptTest() {
// Setup the request & response for the first call
MutateRowsRequest request = MutateRowsRequest.newBuilder().addEntries(Entry.newBuilder().setRowKey(ByteString.copyFromUtf8("0-ok"))).addEntries(Entry.newBuilder().setRowKey(ByteString.copyFromUtf8("1-unavailable"))).addEntries(Entry.newBuilder().setRowKey(ByteString.copyFromUtf8("2-invalid"))).build();
innerCallable.response.add(MutateRowsResponse.newBuilder().addEntries(MutateRowsResponse.Entry.newBuilder().setIndex(0).setStatus(OK_STATUS_PROTO)).addEntries(MutateRowsResponse.Entry.newBuilder().setIndex(1).setStatus(TRANSIENT_ERROR_STATUS_PROTO)).addEntries(MutateRowsResponse.Entry.newBuilder().setIndex(2).setStatus(PERMENANT_ERROR_STATUS_PROTO)).build());
MutateRowsAttemptCallable attemptCallable = new MutateRowsAttemptCallable(innerCallable, request, callContext, retryCodes);
attemptCallable.setExternalFuture(parentFuture);
// Make the first call
attemptCallable.call();
// Setup the request & response for the next call
innerCallable.response = Lists.newArrayList(MutateRowsResponse.newBuilder().addEntries(MutateRowsResponse.Entry.newBuilder().setIndex(0).setStatus(OK_STATUS_PROTO)).build());
attemptCallable.call();
// Make sure that only the entry with the transient error is resubmitted
assertThat(innerCallable.lastRequest.getEntriesCount()).isEqualTo(1);
assertThat(innerCallable.lastRequest.getEntries(0).getRowKey()).isEqualTo(ByteString.copyFromUtf8("1-unavailable"));
// Overall error expectations
Throwable actualError = null;
try {
parentFuture.attemptFuture.get();
} catch (Throwable t) {
actualError = t.getCause();
}
assertThat(actualError).isInstanceOf(MutateRowsException.class);
assertThat(((MutateRowsException) actualError).isRetryable()).isFalse();
// Entry expectations
@SuppressWarnings("ConstantConditions") List<FailedMutation> failedMutations = ((MutateRowsException) actualError).getFailedMutations();
assertThat(failedMutations).hasSize(1);
assertThat(failedMutations.get(0).getIndex()).isEqualTo(2);
assertThat(failedMutations.get(0).getError().getStatusCode().getCode()).isEqualTo(Code.INVALID_ARGUMENT);
assertThat(failedMutations.get(0).getError().isRetryable()).isFalse();
}
use of com.google.cloud.bigtable.data.v2.models.MutateRowsException.FailedMutation in project java-bigtable by googleapis.
the class MutateRowsAttemptCallable method handleAttemptSuccess.
/**
* Handle entry level failures. All new response entries are inspected for failure. If any
* transient failures are found, their corresponding mutations are scheduled for the next RPC. The
* caller is notified of both new found errors and pre-existing permanent errors in the thrown
* {@link MutateRowsException}. If no errors exist, then the attempt future is successfully
* completed.
*/
private void handleAttemptSuccess(List<MutateRowsResponse> responses) {
List<FailedMutation> allFailures = Lists.newArrayList(permanentFailures);
MutateRowsRequest lastRequest = currentRequest;
Builder builder = lastRequest.toBuilder().clearEntries();
List<Integer> newOriginalIndexes = Lists.newArrayList();
for (MutateRowsResponse response : responses) {
for (Entry entry : response.getEntriesList()) {
if (entry.getStatus().getCode() == Code.OK_VALUE) {
continue;
}
int origIndex = getOriginalIndex((int) entry.getIndex());
FailedMutation failedMutation = FailedMutation.create(origIndex, createEntryError(entry.getStatus()));
allFailures.add(failedMutation);
if (!failedMutation.getError().isRetryable()) {
permanentFailures.add(failedMutation);
} else {
// Schedule the mutation entry for the next RPC by adding it to the request builder and
// recording it's original index
newOriginalIndexes.add(origIndex);
builder.addEntries(lastRequest.getEntries((int) entry.getIndex()));
}
}
}
currentRequest = builder.build();
originalIndexes = newOriginalIndexes;
if (!allFailures.isEmpty()) {
boolean isRetryable = builder.getEntriesCount() > 0;
throw new MutateRowsException(null, allFailures, isRetryable);
}
}
Aggregations