# CANCELLED: grpc: client side streaming canceled by client

- **ID:** `grpc/client-side-streaming-cancel`
- **Domain:** grpc
- **Category:** runtime_error
- **Verification:** ai_generated
- **Fix Rate:** 80%

## Root Cause

Client explicitly cancels a streaming RPC (e.g., via context cancel or stream.CloseSend) before server finishes processing, often due to timeout or early exit.

## Version Compatibility

| Version | Status | Introduced | Deprecated |
|---------|--------|------------|------------|
| gRPC Python 1.60+ | active | — | — |
| gRPC Java 1.60+ | active | — | — |
| gRPC Node 1.10+ | active | — | — |

## Workarounds

1. **Check server-side handling of client cancel: ensure server reads from stream until EOF and handles context cancellation gracefully. In Python: for request in stub.StreamingCall(...): try: process(request) except grpc.RpcError as e: if e.code() == grpc.StatusCode.CANCELLED: break** (85% success)
   ```
   Check server-side handling of client cancel: ensure server reads from stream until EOF and handles context cancellation gracefully. In Python: for request in stub.StreamingCall(...): try: process(request) except grpc.RpcError as e: if e.code() == grpc.StatusCode.CANCELLED: break
   ```
2. **Use a graceful shutdown pattern: before canceling, call stream.CloseSend() and wait for server response. In Go: if err := stream.CloseSend(); err != nil { log.Fatal(err) } for { _, err := stream.Recv(); if err == io.EOF { break } }** (80% success)
   ```
   Use a graceful shutdown pattern: before canceling, call stream.CloseSend() and wait for server response. In Go: if err := stream.CloseSend(); err != nil { log.Fatal(err) } for { _, err := stream.Recv(); if err == io.EOF { break } }
   ```

## Dead Ends

- **Adding longer timeouts to all RPCs** — The cancellation is intentional from client logic; longer timeouts only mask the symptom and may cause resource leaks. (50% fail)
- **Ignoring the error and retrying immediately** — Retrying without fixing the cancel logic may loop indefinitely or waste resources. (60% fail)
