grpc / grpc/grpc-java

Unexpected cancellation when subsequent message in client stream exceeds max size

Ouverte
#11,245 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub
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

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.