Skip to content

Commit df91fd5

Browse files
committed
close background executor
1 parent d4da0c7 commit df91fd5

2 files changed

Lines changed: 28 additions & 1 deletion

File tree

google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/BigtableClientContext.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.google.api.core.InternalApi;
2020
import com.google.api.gax.core.BackgroundResource;
2121
import com.google.api.gax.core.CredentialsProvider;
22+
import com.google.api.gax.core.ExecutorAsBackgroundResource;
2223
import com.google.api.gax.core.FixedCredentialsProvider;
2324
import com.google.api.gax.core.FixedExecutorProvider;
2425
import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider;
@@ -35,6 +36,7 @@
3536
import com.google.cloud.bigtable.data.v2.stub.metrics.NoopMetricsProvider;
3637
import com.google.cloud.bigtable.gaxx.grpc.BigtableTransportChannelProvider;
3738
import com.google.cloud.bigtable.gaxx.grpc.ChannelPrimer;
39+
import com.google.common.collect.ImmutableList;
3840
import io.grpc.ManagedChannelBuilder;
3941
import io.grpc.opentelemetry.GrpcOpenTelemetry;
4042
import io.opentelemetry.api.OpenTelemetry;
@@ -77,9 +79,15 @@ public static BigtableClientContext create(EnhancedBigtableStubSettings settings
7779

7880
String universeDomain = settings.getUniverseDomain();
7981

82+
boolean canAutoCloseExecutor = true;
8083
ScheduledExecutorService backgroundExecutor =
8184
settings.getBackgroundExecutorProvider().getExecutor();
82-
85+
if (settings.getBackgroundExecutorProvider() instanceof FixedExecutorProvider) {
86+
// if the background executor in the settings is already a FixedExecutorProvider,
87+
// we can't assume that we can autoclose it and the life cycle should be managed
88+
// by the application
89+
canAutoCloseExecutor = false;
90+
}
8391
FixedExecutorProvider executorProvider = FixedExecutorProvider.create(backgroundExecutor);
8492
builder.setBackgroundExecutorProvider(executorProvider);
8593

@@ -154,6 +162,17 @@ public static BigtableClientContext create(EnhancedBigtableStubSettings settings
154162
}
155163

156164
ClientContext clientContext = ClientContext.create(builder.build());
165+
if (canAutoCloseExecutor) {
166+
// Since we converted background executor to a FixedExecutorProvider, we need
167+
// to add it back to the background resources, so it will be closed when we close the
168+
// client context.
169+
ImmutableList<BackgroundResource> backgroundResources =
170+
ImmutableList.<BackgroundResource>builder()
171+
.addAll(clientContext.getBackgroundResources())
172+
.add(new ExecutorAsBackgroundResource(backgroundExecutor))
173+
.build();
174+
clientContext = clientContext.toBuilder().setBackgroundResources(backgroundResources).build();
175+
}
157176
if (channelPoolMetricsTracer != null) {
158177
channelPoolMetricsTracer.start(clientContext.getExecutor());
159178
}
@@ -208,6 +227,11 @@ public ClientContext getClientContext() {
208227
return this.clientContext;
209228
}
210229

230+
public BigtableClientContext setClientContext(ClientContext clientContext) {
231+
return new BigtableClientContext(
232+
clientContext, this.openTelemetry, this.internalOpenTelemetry, this.metricsProvider);
233+
}
234+
211235
public void close() throws Exception {
212236
for (BackgroundResource resource : clientContext.getBackgroundResources()) {
213237
resource.close();

google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableCloudMonitoringExporter.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,9 @@ static BigtableCloudMonitoringExporter create(
130130

131131
settingsBuilder.setUniverseDomain(universeDomain);
132132

133+
// If background executor is not null, use it for the monitoring client. This allows us to
134+
// share the same background executor with the data client. When it's null, the monitoring
135+
// client will create a new executor service from InstantiatingExecutorProvider.
133136
if (executorService != null) {
134137
settingsBuilder.setBackgroundExecutorProvider(FixedExecutorProvider.create(executorService));
135138
}

0 commit comments

Comments
 (0)