googleapis / googleapis/google-cloud-java

[java-spanner] Possibility to define grpc-timeout dynamically without interacting directly with GrpcCallContext

Offen
#12,262 3 Kommentare 0 Reaktionen 1 zugewiesene Person Zugewiesen an @rahul2393 Auf GitHub ansehen
api: spanner
Vorherrschende Sprache
Java
Sterne
2.1k
Forks
1.2k
Ø Merge
1 T. 23 Std.
Gemergte PRs (30 T.)
154

Beschreibung

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

**Is your feature request related to a problem? Please describe.**
My current system receives request from other system which defines deadline/finishby timeout which varies from request type to request type.
I'd like to instruct spanner client to propagate this value to spanner using 'grpc-timeout' header.
Currently it's possible to do this interacting directly with GrpcCallContext via SpannerOptions.CallContextConfigurator.
It would be great to have it as part of SpannerStubSettings, so I don't need to provide my own implementation of SpannerOptions.CallContextConfigurator and attach it to GrpcContext each time it's needed.

**Describe the solution you'd like**
Not sure of what would be the best approach here. I have one idea in mind:
SpannerStubSettings.Builder already contains method applyToAllUnaryMethods(...).
But it's invoked once when settings are build.
applyDynamicallyToAllUnaryMethods(ApiFunction f) method could be introduced which causes invocation of provided ApiFunction on each method invocation (or limit it to specific methods only to move it to UnaryCallSettings level).

**Describe alternatives you've considered**
Currently my system interact with GrpcCallContext directly via SpannerOptions.CallContextConfigurator:

```
public static class SpannerGrpcCallContextConfigurator implements SpannerOptions.CallContextConfigurator {
public ApiCallContext configure(ApiCallContext context, ReqT request,
MethodDescriptor method) {
if (method == SpannerGrpc.getStreamingReadMethod()) {
return GrpcCallContext.createDefault().withCallOptions(CallOptions.DEFAULT.withDeadlineAfter(/*some deadline*/));
}
return null;
}
}
```

then spanner invocation is wrapped with custom grpc context:

```
Context.current()
.withValue(SpannerOptions.CALL_CONTEXT_CONFIGURATOR_KEY, new SpannerGrpcCallContextConfigurator())
.run(() -> { /* spanner invocation here */ });
```

Beitragsleitfaden

Beitragsleitfaden öffnen

Bewertung

Dieses Issue wurde noch nicht bewertet.

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.