@Test public void testStubSettings() throws IOException { String projectId = "my-project"; BigtableInstanceAdminSettings.Builder builder = BigtableInstanceAdminSettings.newBuilder().setProjectId(projectId); builder.stubSettings().createInstanceSettings().setRetryableCodes(Code.INVALID_ARGUMENT); assertThat(builder.build().getStubSettings().createInstanceSettings().getRetryableCodes()) .containsExactly(Code.INVALID_ARGUMENT); assertThat( builder .build() .toBuilder() .build() .getStubSettings() .createInstanceSettings() .getRetryableCodes()) .containsExactly(Code.INVALID_ARGUMENT); } }
@Test public void testStubSettings() throws IOException { BigtableTableAdminSettings.Builder builder = BigtableTableAdminSettings.newBuilder() .setProjectId("my-project") .setInstanceId("my-instance"); builder.stubSettings().createTableSettings().setRetryableCodes(Code.INVALID_ARGUMENT); assertThat(builder.build().getStubSettings().createTableSettings().getRetryableCodes()) .containsExactly(Code.INVALID_ARGUMENT); assertThat( builder .build() .toBuilder() .build() .getStubSettings() .createTableSettings() .getRetryableCodes()) .containsExactly(Code.INVALID_ARGUMENT); } }
/** * Creates a callable chain to handle point ReadRows RPCs. The chain will: * * <ul> * <li>Convert a {@link Query} into a {@link com.google.bigtable.v2.ReadRowsRequest} and * dispatch the RPC. * <li>Upon receiving the response stream, it will merge the {@link * com.google.bigtable.v2.ReadRowsResponse.CellChunk}s in logical rows. The actual row * implementation can be configured in by the {@code rowAdapter} parameter. * <li>Retry/resume on failure. * <li>Filter out marker rows. * </ul> */ public <RowT> UnaryCallable<Query, RowT> createReadRowCallable(RowAdapter<RowT> rowAdapter) { return createReadRowsCallable( ServerStreamingCallSettings.<Query, Row>newBuilder() .setRetryableCodes(settings.readRowSettings().getRetryableCodes()) .setRetrySettings(settings.readRowSettings().getRetrySettings()) .setIdleTimeout(settings.readRowSettings().getRetrySettings().getTotalTimeout()) .build(), rowAdapter) .first(); }
.setRetryableCodes(settings.createReadSessionSettings().getRetryableCodes()) .setRetrySettings(settings.createReadSessionSettings().getRetrySettings()); .setRetryableCodes(settings.batchCreateReadSessionStreamsSettings().getRetryableCodes()) .setRetrySettings(settings.batchCreateReadSessionStreamsSettings().getRetrySettings()); .setRetryableCodes(settings.finalizeStreamSettings().getRetryableCodes()) .setRetrySettings(settings.finalizeStreamSettings().getRetrySettings()); .setRetryableCodes(settings.splitReadStreamSettings().getRetryableCodes()) .setRetrySettings(settings.splitReadStreamSettings().getRetrySettings());
.setSimpleTimeoutNoRetries( settings.sampleRowKeysSettings().getRetrySettings().getTotalTimeout()) .setRetryableCodes(settings.sampleRowKeysSettings().getRetryableCodes()); .setRetryableCodes(settings.mutateRowSettings().getRetryableCodes()) .setRetrySettings(settings.mutateRowSettings().getRetrySettings()); .setRetryableCodes(settings.checkAndMutateRowSettings().getRetryableCodes()) .setRetrySettings(settings.checkAndMutateRowSettings().getRetrySettings()); .setRetryableCodes(settings.readModifyWriteRowSettings().getRetryableCodes()) .setRetrySettings(settings.readModifyWriteRowSettings().getRetrySettings());
@Test public void checkAndMutateRowSettingsAreNotLostTest() { String dummyProjectId = "my-project"; String dummyInstanceId = "my-instance"; EnhancedBigtableStubSettings.Builder builder = EnhancedBigtableStubSettings.newBuilder() .setProjectId(dummyProjectId) .setInstanceId(dummyInstanceId); RetrySettings retrySettings = RetrySettings.newBuilder().build(); builder .checkAndMutateRowSettings() .setRetryableCodes(Code.ABORTED, Code.DEADLINE_EXCEEDED) .setRetrySettings(retrySettings) .build(); assertThat(builder.checkAndMutateRowSettings().getRetryableCodes()) .containsAllOf(Code.ABORTED, Code.DEADLINE_EXCEEDED); assertThat(builder.checkAndMutateRowSettings().getRetrySettings()).isSameAs(retrySettings); assertThat(builder.build().checkAndMutateRowSettings().getRetryableCodes()) .containsAllOf(Code.ABORTED, Code.DEADLINE_EXCEEDED); assertThat(builder.build().checkAndMutateRowSettings().getRetrySettings()) .isSameAs(retrySettings); assertThat(builder.build().toBuilder().checkAndMutateRowSettings().getRetryableCodes()) .containsAllOf(Code.ABORTED, Code.DEADLINE_EXCEEDED); assertThat(builder.build().toBuilder().checkAndMutateRowSettings().getRetrySettings()) .isSameAs(retrySettings); }
assertThat(builder.sampleRowKeysSettings().getRetrySettings()).isEqualTo(retrySettings); assertThat(builder.build().sampleRowKeysSettings().getRetryableCodes()) .containsAllOf(Code.ABORTED, Code.DEADLINE_EXCEEDED); assertThat(builder.build().sampleRowKeysSettings().getRetrySettings()).isEqualTo(retrySettings);
assertThat(builder.mutateRowSettings().getRetrySettings()).isEqualTo(retrySettings); assertThat(builder.build().mutateRowSettings().getRetryableCodes()) .containsAllOf(Code.ABORTED, Code.DEADLINE_EXCEEDED); assertThat(builder.build().mutateRowSettings().getRetrySettings()).isEqualTo(retrySettings);
assertThat(builder.readRowSettings().getRetrySettings()).isEqualTo(retrySettings); assertThat(builder.build().readRowSettings().getRetryableCodes()) .containsAllOf(Code.ABORTED, Code.DEADLINE_EXCEEDED); assertThat(builder.build().readRowSettings().getRetrySettings()).isEqualTo(retrySettings);
static <RequestT, ResponseT> UnaryCallable<RequestT, ResponseT> createUnaryCallable( UnaryCallable<RequestT, ResponseT> innerCallable, UnaryCallSettings<?, ?> callSettings, ClientContext clientContext) { UnaryCallable<RequestT, ResponseT> callable = new HttpJsonExceptionCallable<>(innerCallable, callSettings.getRetryableCodes()); callable = Callables.retrying(callable, callSettings, clientContext); return callable.withDefaultCallContext(clientContext.getDefaultCallContext()); }
static <RequestT, ResponseT> UnaryCallable<RequestT, ResponseT> createUnaryCallable( UnaryCallable<RequestT, ResponseT> innerCallable, UnaryCallSettings<?, ?> callSettings, ClientContext clientContext) { UnaryCallable<RequestT, ResponseT> callable = new HttpJsonExceptionCallable<>(innerCallable, callSettings.getRetryableCodes()); callable = Callables.retrying(callable, callSettings, clientContext); return callable.withDefaultCallContext(clientContext.getDefaultCallContext()); }
private static <RequestT, ResponseT> UnaryCallable<RequestT, ResponseT> createBaseUnaryCallable( UnaryCallable<RequestT, ResponseT> innerCallable, UnaryCallSettings<RequestT, ResponseT> callSettings, ClientContext clientContext) { UnaryCallable<RequestT, ResponseT> callable = new FakeExceptionCallable<>(innerCallable, callSettings.getRetryableCodes()); callable = Callables.retrying(callable, callSettings, clientContext); return callable; }
/** * Create a Unary callable object with minimal grpc-specific functionality. * * @param grpcCallSettings the gRPC call settings * @param callSettings the Unary call settings * @param clientContext {@link ClientContext} to use to connect to the service. */ public static <RequestT, ResponseT> UnaryCallable<RequestT, ResponseT> createBaseUnaryCallable( GrpcCallSettings<RequestT, ResponseT> grpcCallSettings, UnaryCallSettings<?, ?> callSettings, ClientContext clientContext) { UnaryCallable<RequestT, ResponseT> callable = new GrpcDirectCallable<>(grpcCallSettings.getMethodDescriptor()); if (grpcCallSettings.getParamsExtractor() != null) { callable = new GrpcUnaryRequestParamCallable<>(callable, grpcCallSettings.getParamsExtractor()); } callable = new GrpcExceptionCallable<>(callable, callSettings.getRetryableCodes()); callable = Callables.retrying(callable, callSettings, clientContext); return callable; }
public static <RequestT, ResponseT> UnaryCallable<RequestT, ResponseT> retrying( UnaryCallable<RequestT, ResponseT> innerCallable, UnaryCallSettings<?, ?> callSettings, ClientContext clientContext) { if (callSettings.getRetryableCodes().isEmpty()) { return innerCallable; } RetryAlgorithm<ResponseT> retryAlgorithm = new RetryAlgorithm<>( new ApiResultRetryAlgorithm<ResponseT>(), new ExponentialRetryAlgorithm( callSettings.getRetrySettings(), clientContext.getClock())); ScheduledRetryingExecutor<ResponseT> retryingExecutor = new ScheduledRetryingExecutor<>(retryAlgorithm, clientContext.getExecutor()); return new RetryingCallable<>( clientContext.getDefaultCallContext(), innerCallable, retryingExecutor); }
/** * Create a Unary callable object with minimal grpc-specific functionality. * * @param grpcCallSettings the gRPC call settings * @param callSettings the Unary call settings * @param clientContext {@link ClientContext} to use to connect to the service. */ public static <RequestT, ResponseT> UnaryCallable<RequestT, ResponseT> createBaseUnaryCallable( GrpcCallSettings<RequestT, ResponseT> grpcCallSettings, UnaryCallSettings<?, ?> callSettings, ClientContext clientContext) { UnaryCallable<RequestT, ResponseT> callable = new GrpcDirectCallable<>(grpcCallSettings.getMethodDescriptor()); if (grpcCallSettings.getParamsExtractor() != null) { callable = new GrpcUnaryRequestParamCallable<>(callable, grpcCallSettings.getParamsExtractor()); } callable = new GrpcExceptionCallable<>(callable, callSettings.getRetryableCodes()); callable = Callables.retrying(callable, callSettings, clientContext); return callable; }
public static <RequestT, ResponseT> UnaryCallable<RequestT, ResponseT> retrying( UnaryCallable<RequestT, ResponseT> innerCallable, UnaryCallSettings<?, ?> callSettings, ClientContext clientContext) { if (callSettings.getRetryableCodes().isEmpty()) { return innerCallable; } RetryAlgorithm<ResponseT> retryAlgorithm = new RetryAlgorithm<>( new ApiResultRetryAlgorithm<ResponseT>(), new ExponentialRetryAlgorithm( callSettings.getRetrySettings(), clientContext.getClock())); ScheduledRetryingExecutor<ResponseT> retryingExecutor = new ScheduledRetryingExecutor<>(retryAlgorithm, clientContext.getExecutor()); return new RetryingCallable<>( clientContext.getDefaultCallContext(), innerCallable, retryingExecutor); }
/** * Creates a callable chain to handle point ReadRows RPCs. The chain will: * * <ul> * <li>Convert a {@link Query} into a {@link com.google.bigtable.v2.ReadRowsRequest} and * dispatch the RPC. * <li>Upon receiving the response stream, it will merge the {@link * com.google.bigtable.v2.ReadRowsResponse.CellChunk}s in logical rows. The actual row * implementation can be configured in by the {@code rowAdapter} parameter. * <li>Retry/resume on failure. * <li>Filter out marker rows. * </ul> */ public <RowT> UnaryCallable<Query, RowT> createReadRowCallable(RowAdapter<RowT> rowAdapter) { return createReadRowsCallable( ServerStreamingCallSettings.<Query, Row>newBuilder() .setRetryableCodes(settings.readRowSettings().getRetryableCodes()) .setRetrySettings(settings.readRowSettings().getRetrySettings()) .setIdleTimeout(settings.readRowSettings().getRetrySettings().getTotalTimeout()) .build(), rowAdapter) .first(); }
@Test public void testBuilder() { OperationCallSettings.Builder<Integer, String, Long> builder = OperationCallSettings.newBuilder(); UnaryCallSettings<Integer, OperationSnapshot> initialCallSettings = UnaryCallSettings.<Integer, OperationSnapshot>newUnaryCallSettingsBuilder() .setRetryableCodes(Code.UNAVAILABLE) .build(); TimedRetryAlgorithm pollingAlgorithm = Mockito.mock(TimedRetryAlgorithm.class); ResponseTransformer responseTransformer = new ResponseTransformer(); MetadataTransformer metadataTransformer = new MetadataTransformer(); builder.setPollingAlgorithm(pollingAlgorithm); builder.setResponseTransformer(responseTransformer); builder.setMetadataTransformer(metadataTransformer); builder.setInitialCallSettings(initialCallSettings); Truth.assertThat(builder.getInitialCallSettings()).isSameAs(initialCallSettings); OperationCallSettings settings = builder.build(); Truth.assertThat(settings.getPollingAlgorithm()).isSameAs(pollingAlgorithm); Truth.assertThat(settings.getResponseTransformer()).isSameAs(responseTransformer); Truth.assertThat(settings.getMetadataTransformer()).isSameAs(metadataTransformer); Truth.assertThat(settings.getInitialCallSettings()).isNotNull(); Truth.assertThat(settings.getInitialCallSettings().getRetryableCodes().size()).isEqualTo(1); }
@Test public void testBuilderFromSettings() throws Exception { OperationCallSettings.Builder<Integer, String, Long> builder = OperationCallSettings.newBuilder(); UnaryCallSettings<Integer, OperationSnapshot> initialCallSettings = UnaryCallSettings.<Integer, OperationSnapshot>newUnaryCallSettingsBuilder() .setRetryableCodes(Code.UNAVAILABLE) .build(); TimedRetryAlgorithm pollingAlgorithm = Mockito.mock(TimedRetryAlgorithm.class); ResponseTransformer responseTransformer = new ResponseTransformer(); MetadataTransformer metadataTransformer = new MetadataTransformer(); builder.setPollingAlgorithm(pollingAlgorithm); builder.setResponseTransformer(responseTransformer); builder.setMetadataTransformer(metadataTransformer); builder.setInitialCallSettings(initialCallSettings); Truth.assertThat(builder.getInitialCallSettings()).isSameAs(initialCallSettings); OperationCallSettings settings = builder.build(); OperationCallSettings.Builder newBuilder = settings.toBuilder(); Truth.assertThat(newBuilder.getPollingAlgorithm()).isSameAs(pollingAlgorithm); Truth.assertThat(newBuilder.getResponseTransformer()).isSameAs(responseTransformer); Truth.assertThat(newBuilder.getMetadataTransformer()).isSameAs(metadataTransformer); Truth.assertThat(newBuilder.getInitialCallSettings()).isNotNull(); Truth.assertThat(newBuilder.getInitialCallSettings().getRetryableCodes().size()).isEqualTo(1); }
.setSimpleTimeoutNoRetries( settings.sampleRowKeysSettings().getRetrySettings().getTotalTimeout()) .setRetryableCodes(settings.sampleRowKeysSettings().getRetryableCodes()); .setRetryableCodes(settings.mutateRowSettings().getRetryableCodes()) .setRetrySettings(settings.mutateRowSettings().getRetrySettings()); .setRetryableCodes(settings.checkAndMutateRowSettings().getRetryableCodes()) .setRetrySettings(settings.checkAndMutateRowSettings().getRetrySettings()); .setRetryableCodes(settings.readModifyWriteRowSettings().getRetryableCodes()) .setRetrySettings(settings.readModifyWriteRowSettings().getRetrySettings());