Skip to content

R6: Complete grpc-java streaming transports on Restlet #1561

Open

Description

@jlouvel

Follow-up to R0 draft PR #1556. grpc-java 1.85.1 client transport SPI and a real socket-less ServerImplBuilder/AbstractServerStream host compile and interoperate over Restlet HTTP/2. The native host verifies unary, client half-close, interceptors, unknown-method dispatch and encoded trailers-only errors. It buffers at most 1 MiB per direction and models logical calls, not physical connections. The older manual-framing bidi fixture is diagnostic evidence only.

Acceptance: pinned native SDK channel/services; SDK-owned framing/deframing and per-call serialization; constructor/setter APIs and explicit connector ownership; generated and dynamic unary calls in R3/R4; named-module integration; native metadata/status including errors after messages. R6 must replace manual streaming diagnostics with actual SDK stream transports and test byte budgets, demand/readiness, pre-registration/server cancellation races, idle disconnects and long-lived cleanup. Address/authority/TLS/SNI separation, DNS/LB/subchannels, GOAWAY/draining and PING/keepalive need supported core seams or explicit rejection. R0 prototypes reject unsupported controls and resolved-address forms. Do not promote handwritten gRPC framing or activate grpc-netty as a production fallback.

Activity

  1. jlouvel commented on Nov 5, 2026

    @jlouvel
    CollaboratorAuthor

    Progress: R1 (#1562), R3 (#1563, with fixes #1623 and #1624) and R4 (#1628) are merged into 3.0. GrpcClientAdapter gives a unary, plaintext native channel on a borrowed Restlet HTTP/2 client; GrpcServerAdapter hosts unary and server-streaming methods through a socketless SDK server, with SDK-owned framing, raw response headers, trailers including errors after messages, and bounded messages, queues, calls and durations. Both are named-module integrated, without grpc-netty.

    What remains is this issue's R6 acceptance, unchanged: client streaming on the channel, client-streaming and bidirectional methods on the server (start() rejects them today), SDK readiness and demand within byte budgets, cancellation races, idle disconnects and long-lived cleanup, and the retirement of the R0 manual streaming fixtures. Connection controls (GOAWAY/draining, PING/keepalive, LB/subchannels) and TLS/address separation on the client stay rejected unless a core seam is verified. Retitled accordingly.

    🤖 Generated with Claude Code

  2. changed the title [-]R1/R3/R4/R6: Implement native grpc-java transports on Restlet[/-] [+]R6: Complete grpc-java streaming transports on Restlet[/+] on Nov 5, 2026
  3. self-assigned this
    on Nov 5, 2026
  4. jlouvel commented on Nov 5, 2026

    @jlouvel
    CollaboratorAuthor

    R6a is merged: #1641 hosts client-streaming and bidirectional methods in GrpcServerAdapter, and #1642 streams GrpcClientAdapter calls in both directions within per-call queue budgets (setMaxQueuedBytes). Both are tested against grpc-java's Netty server and against a GrpcServerAdapter.

    Keeping this open for three follow-ups:

    • Retire the R0 spike's handwritten framing fixtures: GrpcSdkTransportSpikeTestCase still carries a manual bidirectional server.
    • Test stop() and idle disconnects on open client-streaming and bidirectional calls; today they are tested on unary and server-streaming calls only.
    • Pass the HTTP/2 reset code to the client, which reports a closed connection today.

    GOAWAY/draining, keepalive, connection age and load balancing stay explicitly out of scope.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions