grpc
runtime_error
ai_generated
true
已取消: grpc: 客户端侧流被客户端中止
CANCELLED: grpc: client-side stream aborted by client
ID: grpc/grpc-client-side-stream-abort
85%修复率
82%置信度
1证据数
2024-01-10首次发现
版本兼容性
| 版本 | 状态 | 引入 | 弃用 | 备注 |
|---|---|---|---|---|
| grpc-go 1.62.0 | active | — | — | — |
| grpc-python 1.60.0 | active | — | — | — |
| grpc-node 1.10.0 | active | — | — | — |
根因分析
客户端在服务器完成处理之前显式关闭或取消了流,通常是由于过早的上下文取消或 stream.CloseSend() 的误用。
English
Client explicitly closed or cancelled the stream before the server finished processing, often due to premature context cancellation or stream.CloseSend() misuse.
官方文档
https://grpc.io/docs/languages/go/basics/#client-side-streaming-rpc解决方案
-
Ensure the client does not call stream.CloseSend() before receiving all server responses. In gRPC-Go, use a proper pattern: stream, err := client.StreamingMethod(ctx) // Send all messages stream.CloseSend() // Then receive all responses for { resp, err := stream.Recv() if err == io.EOF { break } } -
Add a defer cancel() after creating the context to ensure proper cleanup without premature cancellation: ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() stream, _ := client.StreamingMethod(ctx) // Use stream // cancel() will be called when function returns, not before stream completes
无效尝试
常见但无效的做法:
-
80% 失败
The error is caused by explicit cancellation or stream abort, not timeout; extending timeout doesn't prevent premature CloseSend().
-
95% 失败
The stream is already closed; server cannot send responses, leading to resource leaks and inconsistent state.