Unexpected cancellation when subsequent message in client stream exceeds max size
- Langage dominant
- Java
- Étoiles
- 12.1k
- Forks
- 4k
- Merge moyen
- 2 j 17 h
- PR mergées (30 j)
- 37
Description
This is *almost* a duplicate of #3996. That issue was ostensibly fixed in #11073. (And that same PR also seems to have fixed the issue reported in #10971.)
*However*, that fix seems to only work reliably when the error pertains to the **first** request message in a stream. So it works fine for unary and server-stream RPCs. However, for client-stream and bidi-stream RPCs, if some message in the request stream *after the first one* exceeds the configured max size, the old behavior still exists:
* A warning is logged with an exception that indicates the expected/correct error code:
```
WARNING: Exception processing message
io.grpc.StatusRuntimeException: RESOURCE_EXHAUSTED: gRPC message exceeds maximum size 204800: 204810
at io.grpc.Status.asRuntimeException(Status.java:525)
at io.grpc.internal.MessageDeframer.processHeader(MessageDeframer.java:392)
at io.grpc.internal.MessageDeframer.deliver(MessageDeframer.java:272)
at io.grpc.internal.MessageDeframer.request(MessageDeframer.java:162)
at io.grpc.internal.AbstractStream$TransportState$1RequestRunnable.run(AbstractStream.java:264)
at io.grpc.netty.NettyServerStream$TransportState$1.run(NettyServerStream.java:174)
at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:173)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:166)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:1583)
```
- But then a RST_STREAM frame is sent and the client instead observes a CANCELLED code.
Guide de contribution
Ouvrir le guide de contribution
Piste de recherche
Commencez par les points d’entrée de la stack trace MessageDeframer.processHeader, AbstractStream et NettyServerStream, puis comparez le traitement du premier message de request avec celui des messages suivants dans les appels client-stream et bidi-stream. Reproduisez un message suivant trop volumineux et vérifiez que le client observe RESOURCE_EXHAUSTED plutôt que CANCELLED, avec des tests couvrant les deux modes de streaming.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- grpc, java
- Domaine
- backend-api-design, networking
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 35/100