diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpc.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpc.java index 001ffc1239..da3fc04c0a 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpc.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpc.java @@ -191,6 +191,12 @@ private synchronized void shutdown() { executor.shutdown(); } } + + private void awaitTermination() throws InterruptedException { + for (ScheduledExecutorService executor : executors) { + executor.awaitTermination(10L, TimeUnit.SECONDS); + } + } } private static final PathTemplate PROJECT_NAME_TEMPLATE = @@ -1230,10 +1236,22 @@ GrpcCallContext newCallContext(@Nullable Map options, String resource public void shutdown() { this.rpcIsClosed = true; this.spannerStub.close(); + this.partitionedDmlStub.close(); this.instanceAdminStub.close(); this.databaseAdminStub.close(); this.spannerWatchdog.shutdown(); this.executorProvider.shutdown(); + + try { + this.spannerStub.awaitTermination(10L, TimeUnit.SECONDS); + this.partitionedDmlStub.awaitTermination(10L, TimeUnit.SECONDS); + this.instanceAdminStub.awaitTermination(10L, TimeUnit.SECONDS); + this.databaseAdminStub.awaitTermination(10L, TimeUnit.SECONDS); + this.spannerWatchdog.awaitTermination(10L, TimeUnit.SECONDS); + this.executorProvider.awaitTermination(); + } catch (InterruptedException e) { + throw SpannerExceptionFactory.propagateInterrupt(e); + } } @Override