in v1/src/main/java/com/google/cloud/teleport/spanner/spannerio/SpannerAccessor.java [112:252]
static SpannerOptions buildSpannerOptions(SpannerConfig spannerConfig) {
SpannerOptions.Builder builder = SpannerOptions.newBuilder();
Set<Code> retryableCodes = new HashSet<>();
if (spannerConfig.getRetryableCodes() != null) {
retryableCodes.addAll(spannerConfig.getRetryableCodes());
}
if (spannerConfig.getDataBoostEnabled() != null && spannerConfig.getDataBoostEnabled().get()) {
retryableCodes.add(Code.RESOURCE_EXHAUSTED);
}
// Add default retryable codes for unary methods
Set<Code> unaryMethodRetryableCodes = new HashSet<>(retryableCodes);
unaryMethodRetryableCodes.addAll(
builder.getSpannerStubSettingsBuilder().getSessionSettings().getRetryableCodes());
// Set retryable codes for all API methods
builder
.getSpannerStubSettingsBuilder()
.applyToAllUnaryMethods(
input -> {
input.setRetryableCodes(unaryMethodRetryableCodes);
return null;
});
// Add default retryable codes for streaming methods
Set<Code> streamingMethodRetryableCodes = new HashSet<>(retryableCodes);
streamingMethodRetryableCodes.addAll(
builder.getSpannerStubSettingsBuilder().executeStreamingSqlSettings().getRetryableCodes());
builder
.getSpannerStubSettingsBuilder()
.executeStreamingSqlSettings()
.setRetryableCodes(streamingMethodRetryableCodes);
builder
.getSpannerStubSettingsBuilder()
.streamingReadSettings()
.setRetryableCodes(streamingMethodRetryableCodes);
// Set commit retry settings
UnaryCallSettings.Builder<CommitRequest, CommitResponse> commitSettings =
builder.getSpannerStubSettingsBuilder().commitSettings();
ValueProvider<Duration> commitDeadline = spannerConfig.getCommitDeadline();
if (spannerConfig.getCommitRetrySettings() != null) {
commitSettings.setRetrySettings(spannerConfig.getCommitRetrySettings());
} else if (commitDeadline != null && commitDeadline.get().getMillis() > 0) {
// Set the GRPC deadline on the Commit API call.
RetrySettings.Builder commitRetrySettingsBuilder =
commitSettings.getRetrySettings().toBuilder();
commitSettings.setRetrySettings(
commitRetrySettingsBuilder
.setTotalTimeoutDuration(
java.time.Duration.ofMillis(commitDeadline.get().getMillis()))
.setMaxRpcTimeoutDuration(
java.time.Duration.ofMillis(commitDeadline.get().getMillis()))
.setInitialRpcTimeoutDuration(
java.time.Duration.ofMillis(commitDeadline.get().getMillis()))
.build());
}
// Set execute streaming sql retry settings
ServerStreamingCallSettings.Builder<ExecuteSqlRequest, PartialResultSet>
executeStreamingSqlSettings =
builder.getSpannerStubSettingsBuilder().executeStreamingSqlSettings();
if (spannerConfig.getExecuteStreamingSqlRetrySettings() != null) {
executeStreamingSqlSettings.setRetrySettings(
spannerConfig.getExecuteStreamingSqlRetrySettings());
} else {
// Setting the timeout for streaming read to 2 hours. This is 1 hour by default
// after BEAM 2.20.
RetrySettings.Builder executeSqlStreamingRetrySettings =
executeStreamingSqlSettings.getRetrySettings().toBuilder();
executeStreamingSqlSettings.setRetrySettings(
executeSqlStreamingRetrySettings
.setInitialRpcTimeoutDuration(java.time.Duration.ofMinutes(120))
.setMaxRpcTimeoutDuration(java.time.Duration.ofMinutes(120))
.setTotalTimeoutDuration(java.time.Duration.ofMinutes(120))
.setRpcTimeoutMultiplier(1.0)
.setInitialRetryDelayDuration(java.time.Duration.ofSeconds(2))
.setMaxRetryDelayDuration(java.time.Duration.ofSeconds(60))
.setRetryDelayMultiplier(1.5)
.setMaxAttempts(100)
.build());
// This property sets the default timeout between 2 response packets in the client library.
System.setProperty("com.google.cloud.spanner.watchdogTimeoutSeconds", "7200");
}
SpannerStubSettings.Builder spannerStubSettingsBuilder =
builder.getSpannerStubSettingsBuilder();
ValueProvider<Duration> partitionQueryTimeout = spannerConfig.getPartitionQueryTimeout();
if (partitionQueryTimeout != null
&& partitionQueryTimeout.get() != null
&& partitionQueryTimeout.get().getMillis() > 0) {
spannerStubSettingsBuilder
.partitionQuerySettings()
.setSimpleTimeoutNoRetries(
org.threeten.bp.Duration.ofMillis(partitionQueryTimeout.get().getMillis()));
}
ValueProvider<Duration> partitionReadTimeout = spannerConfig.getPartitionReadTimeout();
if (partitionReadTimeout != null
&& partitionReadTimeout.get() != null
&& partitionReadTimeout.get().getMillis() > 0) {
spannerStubSettingsBuilder
.partitionReadSettings()
.setSimpleTimeoutNoRetries(
org.threeten.bp.Duration.ofMillis(partitionReadTimeout.get().getMillis()));
}
ValueProvider<String> projectId = spannerConfig.getProjectId();
if (projectId != null) {
builder.setProjectId(projectId.get());
}
ServiceFactory<Spanner, SpannerOptions> serviceFactory = spannerConfig.getServiceFactory();
if (serviceFactory != null) {
builder.setServiceFactory(serviceFactory);
}
ValueProvider<String> host = spannerConfig.getHost();
if (host != null) {
String hostValue = host.get();
if (hostValue != null && !hostValue.trim().isEmpty()) {
builder.setHost(hostValue);
}
}
ValueProvider<String> emulatorHost = spannerConfig.getEmulatorHost();
if (emulatorHost != null) {
builder.setEmulatorHost(emulatorHost.get());
if (spannerConfig.getIsLocalChannelProvider() != null
&& spannerConfig.getIsLocalChannelProvider().get()) {
builder.setChannelProvider(LocalChannelProvider.create(emulatorHost.get()));
}
builder.setCredentials(NoCredentials.getInstance());
}
String userAgentString = USER_AGENT_PREFIX + "/" + ReleaseInfo.getReleaseInfo().getVersion();
builder.setHeaderProvider(FixedHeaderProvider.create("user-agent", userAgentString));
ValueProvider<String> databaseRole = spannerConfig.getDatabaseRole();
if (databaseRole != null && databaseRole.get() != null && !databaseRole.get().isEmpty()) {
builder.setDatabaseRole(databaseRole.get());
}
ValueProvider<Credentials> credentials = spannerConfig.getCredentials();
if (credentials != null && credentials.get() != null) {
builder.setCredentials(credentials.get());
}
return builder.build();
}