Skip to content

Commit 8553cb9

Browse files
committed
chore: use ScheduledExecutorService instead of Executor
pre-work For retries we will need the ability to schedule work in the future. Rather than sleeping on the current thread we can schedule the run of an operation after the backoff duration with ScheduledExecutorService#schedule. Sourcing the executor service will first attempt to get it from the storage client settings, if it is unable to be resolved (either beacuse settings are null, or the returned provider) construct our own.
1 parent 758756f commit 8553cb9

File tree

5 files changed

+56
-9
lines changed

5 files changed

+56
-9
lines changed

google-cloud-storage/src/main/java/com/google/cloud/storage/BlobDescriptorImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import io.grpc.Status.Code;
3434
import java.io.IOException;
3535
import java.util.OptionalLong;
36-
import java.util.concurrent.Executor;
36+
import java.util.concurrent.ScheduledExecutorService;
3737

3838
final class BlobDescriptorImpl implements BlobDescriptor {
3939

@@ -115,7 +115,7 @@ static ApiFuture<BlobDescriptor> create(
115115
BidiReadObjectRequest openRequest,
116116
GrpcCallContext context,
117117
ZeroCopyBidiStreamingCallable<BidiReadObjectRequest, BidiReadObjectResponse> callable,
118-
Executor executor) {
118+
ScheduledExecutorService executor) {
119119
BlobDescriptorState state = new BlobDescriptorState(openRequest);
120120

121121
BlobDescriptorStream stream = BlobDescriptorStream.create(executor, callable, context, state);

google-cloud-storage/src/main/java/com/google/cloud/storage/BlobDescriptorStream.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import java.util.List;
4343
import java.util.concurrent.ExecutionException;
4444
import java.util.concurrent.Executor;
45+
import java.util.concurrent.ScheduledExecutorService;
4546
import java.util.concurrent.TimeUnit;
4647
import java.util.concurrent.TimeoutException;
4748
import java.util.concurrent.atomic.AtomicInteger;
@@ -52,7 +53,7 @@ final class BlobDescriptorStream
5253
private final SettableApiFuture<Void> blobDescriptorResolveFuture;
5354

5455
private final BlobDescriptorState state;
55-
private final Executor executor;
56+
private final ScheduledExecutorService executor;
5657
private final ZeroCopyBidiStreamingCallable<BidiReadObjectRequest, BidiReadObjectResponse>
5758
callable;
5859
private final GrpcCallContext context;
@@ -67,7 +68,7 @@ final class BlobDescriptorStream
6768

6869
private BlobDescriptorStream(
6970
BlobDescriptorState state,
70-
Executor executor,
71+
ScheduledExecutorService executor,
7172
ZeroCopyBidiStreamingCallable<BidiReadObjectRequest, BidiReadObjectResponse> callable,
7273
GrpcCallContext context,
7374
int maxRedirectsAllowed) {
@@ -452,7 +453,7 @@ public void onComplete() {
452453
}
453454

454455
static BlobDescriptorStream create(
455-
Executor executor,
456+
ScheduledExecutorService executor,
456457
ZeroCopyBidiStreamingCallable<BidiReadObjectRequest, BidiReadObjectResponse> callable,
457458
GrpcCallContext context,
458459
BlobDescriptorState state) {

google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageImpl.java

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import com.google.api.core.ApiFuture;
3333
import com.google.api.core.ApiFutures;
3434
import com.google.api.core.BetaApi;
35+
import com.google.api.gax.core.InstantiatingExecutorProvider;
3536
import com.google.api.gax.grpc.GrpcCallContext;
3637
import com.google.api.gax.paging.AbstractPage;
3738
import com.google.api.gax.paging.Page;
@@ -105,6 +106,7 @@
105106
import com.google.storage.v2.RewriteObjectRequest;
106107
import com.google.storage.v2.RewriteResponse;
107108
import com.google.storage.v2.StorageClient;
109+
import com.google.storage.v2.StorageSettings;
108110
import com.google.storage.v2.UpdateBucketRequest;
109111
import com.google.storage.v2.UpdateObjectRequest;
110112
import com.google.storage.v2.WriteObjectRequest;
@@ -134,8 +136,7 @@
134136
import java.util.Spliterators.AbstractSpliterator;
135137
import java.util.concurrent.Callable;
136138
import java.util.concurrent.ExecutionException;
137-
import java.util.concurrent.Executor;
138-
import java.util.concurrent.Executors;
139+
import java.util.concurrent.ScheduledExecutorService;
139140
import java.util.concurrent.TimeUnit;
140141
import java.util.function.Consumer;
141142
import java.util.function.Predicate;
@@ -175,7 +176,7 @@ final class GrpcStorageImpl extends BaseService<StorageOptions>
175176
final GrpcConversions codecs;
176177
final GrpcRetryAlgorithmManager retryAlgorithmManager;
177178
final SyntaxDecoders syntaxDecoders;
178-
final Executor executor;
179+
final ScheduledExecutorService executor;
179180

180181
// workaround for https://github.com/googleapis/java-storage/issues/1736
181182
private final Opts<UserProject> defaultOpts;
@@ -198,7 +199,24 @@ final class GrpcStorageImpl extends BaseService<StorageOptions>
198199
this.retryAlgorithmManager = options.getRetryAlgorithmManager();
199200
this.syntaxDecoders = new SyntaxDecoders();
200201
this.defaultProjectId = Suppliers.memoize(() -> UnifiedOpts.projectId(options.getProjectId()));
201-
this.executor = Executors.newCachedThreadPool();
202+
this.executor =
203+
Utils.firstNonNull(
204+
() -> {
205+
if (storageClient == null) {
206+
return null;
207+
}
208+
StorageSettings settings = storageClient.getSettings();
209+
if (settings == null) {
210+
return null;
211+
}
212+
return settings.getBackgroundExecutorProvider();
213+
},
214+
() -> {
215+
// TODO: if we make it to here, ensure we track the need to shutdown the executor
216+
// separate from StorageClient
217+
return InstantiatingExecutorProvider.newBuilder().build();
218+
})
219+
.getExecutor();
202220
}
203221

204222
@Override

google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageOptions.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import com.google.api.gax.rpc.ServerStreamingCallable;
4343
import com.google.api.gax.rpc.StatusCode.Code;
4444
import com.google.api.gax.rpc.internal.QuotaProjectIdHidingCredentials;
45+
import com.google.api.gax.tracing.ApiTracerFactory;
4546
import com.google.api.pathtemplate.PathTemplate;
4647
import com.google.auth.Credentials;
4748
import com.google.cloud.NoCredentials;
@@ -651,6 +652,20 @@ public GrpcStorageOptions.Builder setBlobWriteSessionConfig(
651652
return this;
652653
}
653654

655+
@BetaApi
656+
@Override
657+
public GrpcStorageOptions.Builder setUniverseDomain(String universeDomain) {
658+
super.setUniverseDomain(universeDomain);
659+
return this;
660+
}
661+
662+
@BetaApi
663+
@Override
664+
public GrpcStorageOptions.Builder setApiTracerFactory(ApiTracerFactory apiTracerFactory) {
665+
super.setApiTracerFactory(apiTracerFactory);
666+
return this;
667+
}
668+
654669
/**
655670
* Enable OpenTelemetry Tracing and provide an instance for the client to use.
656671
*

google-cloud-storage/src/main/java/com/google/cloud/storage/HttpStorageOptions.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.google.api.core.InternalApi;
2525
import com.google.api.gax.retrying.RetrySettings;
2626
import com.google.api.gax.rpc.HeaderProvider;
27+
import com.google.api.gax.tracing.ApiTracerFactory;
2728
import com.google.auth.Credentials;
2829
import com.google.cloud.ServiceFactory;
2930
import com.google.cloud.ServiceRpc;
@@ -270,6 +271,18 @@ public HttpStorageOptions.Builder setBlobWriteSessionConfig(
270271
return this;
271272
}
272273

274+
@Override
275+
public HttpStorageOptions.Builder setUniverseDomain(String universeDomain) {
276+
super.setUniverseDomain(universeDomain);
277+
return this;
278+
}
279+
280+
@Override
281+
public HttpStorageOptions.Builder setApiTracerFactory(ApiTracerFactory apiTracerFactory) {
282+
super.setApiTracerFactory(apiTracerFactory);
283+
return this;
284+
}
285+
273286
@Override
274287
public HttpStorageOptions build() {
275288
HttpStorageOptions options = new HttpStorageOptions(this, defaults());

0 commit comments

Comments
 (0)