private void writeObject(ObjectOutputStream output) throws IOException { output.defaultWriteObject(); builder.build().writeTo(output); }
/** * Handle an RPC level failure by generating a {@link FailedMutation} for each expected entry. The * newly generated {@link FailedMutation}s will be combined with the permanentFailures to give the * caller the whole picture since the first call. This method will always throw a {@link * MutateRowsException}. */ private void handleAttemptError(Throwable rpcError) { ApiException entryError = createSyntheticErrorForRpcFailure(rpcError); ImmutableList.Builder<FailedMutation> allFailures = ImmutableList.builder(); MutateRowsRequest lastRequest = currentRequest; allFailures.addAll(permanentFailures); Builder builder = lastRequest.toBuilder().clearEntries(); List<Integer> newOriginalIndexes = Lists.newArrayList(); for (int i = 0; i < currentRequest.getEntriesCount(); i++) { int origIndex = getOriginalIndex(i); FailedMutation failedMutation = FailedMutation.create(origIndex, entryError); 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 its original index newOriginalIndexes.add(origIndex); builder.addEntries(lastRequest.getEntries(i)); } } currentRequest = builder.build(); originalIndexes = newOriginalIndexes; throw new MutateRowsException(rpcError, allFailures.build(), entryError.isRetryable()); }
currentRequest = builder.build(); originalIndexes = newOriginalIndexes;
/** {@inheritDoc} */ @Override public List<MutateRowsResponse> mutateRows(MutateRowsRequest request) { if (shouldOverrideAppProfile(request.getAppProfileId())) { request = request.toBuilder().setAppProfileId(clientDefaultAppProfileId).build(); } return createMutateRowsOperation(request).getBlockingResult(); }
/** {@inheritDoc} */ @Override public ListenableFuture<List<MutateRowsResponse>> mutateRowsAsync(MutateRowsRequest request) { if (shouldOverrideAppProfile(request.getAppProfileId())) { request = request.toBuilder().setAppProfileId(clientDefaultAppProfileId).build(); } return createMutateRowsOperation(request).getAsyncResult(); }
@InternalApi public MutateRowsRequest toProto(RequestContext requestContext) { String tableName = NameUtil.formatTableName( requestContext.getProjectId(), requestContext.getInstanceId(), tableId); return builder .setTableName(tableName) .setAppProfileId(requestContext.getAppProfileId()) .build(); } }
.addEntries(Entry.newBuilder().setRowKey(ByteString.copyFromUtf8("1-unavailable"))) .addEntries(Entry.newBuilder().setRowKey(ByteString.copyFromUtf8("2-invalid"))) .build();
.addEntries(Entry.getDefaultInstance()) .addEntries(Entry.getDefaultInstance()) .build();
.addEntries(Entry.getDefaultInstance()) .addEntries(Entry.getDefaultInstance()) .build();
.addEntries(Entry.getDefaultInstance()) .addEntries(Entry.getDefaultInstance()) .build();
@Test @SuppressWarnings("all") public void mutateRowsExceptionTest() throws Exception { StatusRuntimeException exception = new StatusRuntimeException(Status.INVALID_ARGUMENT); mockBigtable.addException(exception); TableName tableName = TableName.of("[PROJECT]", "[INSTANCE]", "[TABLE]"); List<MutateRowsRequest.Entry> entries = new ArrayList<>(); MutateRowsRequest request = MutateRowsRequest.newBuilder() .setTableName(tableName.toString()) .addAllEntries(entries) .build(); MockStreamObserver<MutateRowsResponse> responseObserver = new MockStreamObserver<>(); ServerStreamingCallable<MutateRowsRequest, MutateRowsResponse> callable = client.mutateRowsCallable(); callable.serverStreamingCall(request, responseObserver); try { List<MutateRowsResponse> actualResponses = responseObserver.future().get(); Assert.fail("No exception thrown"); } catch (ExecutionException e) { Assert.assertTrue(e.getCause() instanceof InvalidArgumentException); InvalidArgumentException apiException = (InvalidArgumentException) e.getCause(); Assert.assertEquals(StatusCode.Code.INVALID_ARGUMENT, apiException.getStatusCode().getCode()); } }
@Test @SuppressWarnings("all") public void mutateRowsTest() throws Exception { MutateRowsResponse expectedResponse = MutateRowsResponse.newBuilder().build(); mockBigtable.addResponse(expectedResponse); TableName tableName = TableName.of("[PROJECT]", "[INSTANCE]", "[TABLE]"); List<MutateRowsRequest.Entry> entries = new ArrayList<>(); MutateRowsRequest request = MutateRowsRequest.newBuilder() .setTableName(tableName.toString()) .addAllEntries(entries) .build(); MockStreamObserver<MutateRowsResponse> responseObserver = new MockStreamObserver<>(); ServerStreamingCallable<MutateRowsRequest, MutateRowsResponse> callable = client.mutateRowsCallable(); callable.serverStreamingCall(request, responseObserver); List<MutateRowsResponse> actualResponses = responseObserver.future().get(); Assert.assertEquals(1, actualResponses.size()); Assert.assertEquals(expectedResponse, actualResponses.get(0)); }
private static MutateRowsRequest createRequest(int count) { MutateRowsRequest.Builder request = MutateRowsRequest.newBuilder() .setTableName(NameUtil.formatTableName(PROJECT_ID, INSTANCE_ID, TABLE_ID)); for (int i = 0; i < count; i++) { Builder entry = Entry.newBuilder() .addMutations( Mutation.newBuilder() .setSetCell( SetCell.newBuilder() .setFamilyName("family") .setColumnQualifier(ByteString.copyFromUtf8("col" + i)) .setTimestampMicros(1000) .setValue(ByteString.copyFromUtf8("value" + i)))); request.addEntries(entry); } return request.build(); } }
@Test public void testNoRpcTimeout() { parentFuture.timedAttemptSettings = parentFuture.timedAttemptSettings.toBuilder().setRpcTimeout(Duration.ZERO).build(); MutateRowsRequest request = MutateRowsRequest.newBuilder().addEntries(Entry.getDefaultInstance()).build(); innerCallable.response.add( MutateRowsResponse.newBuilder() .addEntries( MutateRowsResponse.Entry.newBuilder().setIndex(0).setStatus(OK_STATUS_PROTO)) .build()); MutateRowsAttemptCallable attemptCallable = new MutateRowsAttemptCallable(innerCallable, request, callContext, retryCodes); attemptCallable.setExternalFuture(parentFuture); attemptCallable.call(); assertThat(innerCallable.lastContext.getTimeout()).isNull(); }
@Test public void singleEntrySuccessTest() throws Exception { MutateRowsRequest request = MutateRowsRequest.newBuilder().addEntries(Entry.getDefaultInstance()).build(); innerCallable.response.add( MutateRowsResponse.newBuilder() .addEntries( MutateRowsResponse.Entry.newBuilder().setIndex(0).setStatus(OK_STATUS_PROTO)) .build()); MutateRowsAttemptCallable attemptCallable = new MutateRowsAttemptCallable(innerCallable, request, callContext, retryCodes); attemptCallable.setExternalFuture(parentFuture); attemptCallable.call(); // Attempt completed successfully and the useless response has been suppressed assertThat(parentFuture.attemptFuture.get()).isNull(); // innerCallable received the request assertThat(innerCallable.lastRequest).isEqualTo(request); }
/** * Creates a single entry bulk {@link com.google.bigtable.v2.MutateRowsRequest}, which will be * merged by the batching logic in the callable chain. */ @InternalApi public MutateRowsRequest toBulkProto(RequestContext requestContext) { String tableName = NameUtil.formatTableName( requestContext.getProjectId(), requestContext.getInstanceId(), tableId); return MutateRowsRequest.newBuilder() .setAppProfileId(requestContext.getAppProfileId()) .setTableName(tableName) .addEntries( Entry.newBuilder().setRowKey(key).addAllMutations(mutation.getMutations()).build()) .build(); } }
@Test public void requestBuilderTest() { RequestBuilder<MutateRowsRequest> builder = descriptor.getRequestBuilder(); MutateRowsRequest expected = createRequest(5); for (Entry entry : expected.getEntriesList()) { MutateRowsRequest singleReq = MutateRowsRequest.newBuilder() .setTableName(NameUtil.formatTableName(PROJECT_ID, INSTANCE_ID, TABLE_ID)) .addEntries(entry) .build(); builder.appendRequest(singleReq); } MutateRowsRequest actual = builder.build(); assertThat(actual).isEqualTo(expected); }
@Test public void partitionKeyTest() { String myTableName = NameUtil.formatTableName("my-project", "my-instance", "my-table"); MutateRowsRequest request = createRequest(2).toBuilder().setTableName(myTableName).build(); PartitionKey actual = descriptor.getBatchPartitionKey(request); assertThat(actual).isEqualTo(new PartitionKey(myTableName)); }
@InternalApi public MutateRowsRequest toProto(RequestContext requestContext) { String tableName = NameUtil.formatTableName( requestContext.getProjectId(), requestContext.getInstanceId(), tableId); return builder .setTableName(tableName) .setAppProfileId(requestContext.getAppProfileId()) .build(); } }
@Override public MutateRowsRequest build() { return builder.build(); } }