blocking stub v2 server streaming calls sometimes require .read() to initiate request
- Vorherrschende Sprache
- Java
- Sterne
- 12.1k
- Forks
- 4k
- Ø Merge
- 2 T. 17 Std.
- Gemergte PRs (30 T.)
- 37
Beschreibung
If the channel is in an idle state when `ClientCalls.blockingV2ServerStreamingCall` is invoked, sending the request will be queued up in `DelayedClientTransport`. When the connection is set up, `DelayedClientTransport` will run all the deferred request initiation steps on the call executor: https://github.com/grpc/grpc-java/blob/b88536a17d320065a972858e17e44e1e5c656a0f/core/src/main/java/io/grpc/internal/DelayedClientTransport.java#L306-L312 Unfortunately, the call executor for the blocking v2 stubs is a `ThreadSafeThreadlessExecutor`, which means the headers and request aren't actually sent until the client calls `.read()` on the `BlockingClientCall`.
In contrast, the blocking v1 stub always sent the request as soon as possible.
Beitragsleitfaden
Rechercherichtung
Beginne in core/src/main/java/io/grpc/internal/DelayedClientTransport.java bei den Schritten zur verzögerten Anforderungsinitiierung in den Zeilen 306–312 und verfolge dann den ThreadSafeThreadlessExecutor, der von blockierenden v2-Stubs verwendet wird. Reproduziere den Fall eines inaktiven Kanals und überprüfe, dass die Header und die Anfrage gesendet werden, ohne dass BlockingClientCall.read() erforderlich ist.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- java
- Bereich
- api
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 42/100