googleapis / googleapis/google-cloud-java

[java-spanner] RetrySettings for StreamingRead/StreamingSql

Open
#12,263 1 comment 0 reactions 1 assignee Assigned to @rahul2393 View on GitHub
api: spanner type: feature request
Dominant language
Java
Stars
2.1k
Forks
1.2k
Avg merge
1d 23h
Merged PRs (30d)
154

Description

Thanks for stopping by to let us know something could be better!

**Is your feature request related to a problem? Please describe.**
Recently I was working on fine tunning timeouts/retry settings for Spanner requests for one of applications.
I noticed that initRpcTimeout doesn't works on StreamingRead/StreamingSql type of requests.
So I started to go through source code and found that there are 3 places/configurations where I can work with timeouts:
- streamWaitTimeout property from GrpcCallContext which is used by WatchdogServerStreamingCallable to interrupt streaming request
- timeout property from GrpcCallContext which is used as source for 'grpc-timeout' header (if specified, otherwise totalTimeout from retrySettings is used)
- streamWatchdogCheckInterval from StubSettings which defines check interval for Watchdog used to interrupt streaming

First two aren't configurable from RetrySettings level.
Could you please makes them part of RetrySettings, so I don't have to interact with GrpcCallContext directly?

**Describe the solution you'd like**
Either to have separate set of properties in RetrySettings like (and recalculate them similarly to initRpcTimeout during retries):
```
var settings = RetrySettings.newBuilder()
.setStreamWaitTimeout(Duration.ofMillis(streamWaitTimeout))
.setSingleRequestTimeout(Duration.ofMillis(singleRequestTimeout)) // used as grpc-timeout
```
or reuse initRpcTimeout as streamWaitTimeout/grpc-timeout:
```
var settings = RetrySettings.newBuilder()
.setInitialRpcTimeout(Duration.ofMillis(initialRpcTimeout)) // used as both streamingWaitTimeout and grpc-timeout
```
**Describe alternatives you've considered**
Currently I interact with GrpcCallContext directly to set this values:
```
public static class SpannerGrpcCallContextConfigurator implements SpannerOptions.CallContextConfigurator {
public ApiCallContext configure(ApiCallContext context, ReqT request,
MethodDescriptor method) {
if (method == SpannerGrpc.getStreamingReadMethod()) {
return GrpcCallContext.createDefault().
.withTimeout(/*some timeout*/)
.withStreamWaitTimeout(/*some timeout*/);
}
return null;
}
}
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.