hyperledger/fabric · error
didn't receive a response within %v
Error message
didn't receive a response within %v
What it means
The impatientStream's Recv wraps the underlying gRPC Recv in a select with a timeout; if the remote ordering node sends no Deliver/Step response before stream.waitTimeout elapses, the stream is cancelled and this error is returned. It indicates an unresponsive or overloaded remote node.
Source
Thrown at orderer/common/cluster/deliver.go:595
responseChan := make(chan errorAndResponse, 1)
// receive waitGroup ensures the goroutine below exits before
// this function exits.
var receive sync.WaitGroup
receive.Add(1)
defer receive.Wait()
go func() {
defer receive.Done()
resp, err := stream.AtomicBroadcast_DeliverClient.Recv()
responseChan <- errorAndResponse{err: err, resp: resp}
}()
select {
case <-timeout.C:
stream.cancelFunc()
return nil, errors.Errorf("didn't receive a response within %v", stream.waitTimeout)
case respAndErr := <-responseChan:
return respAndErr.resp, respAndErr.err
}
}
// NewImpatientStream returns a ImpatientStreamCreator that creates impatientStreams.
func NewImpatientStream(conn *grpc.ClientConn, waitTimeout time.Duration) ImpatientStreamCreator {
return func() (*ImpatientStream, error) {
abc := orderer.NewAtomicBroadcastClient(conn)
ctx, cancel := context.WithCancel(context.Background())
stream, err := abc.Deliver(ctx)
if err != nil {
cancel()
return nil, err
}
cert := util.ExtractCertificateFromContext(stream.Context())View on GitHub (pinned to 2736b63f8f)
Solutions
- Increase the relevant timeout configuration (e.g. General.Cluster.SendBufferSize / deliver request timeout) if pulls legitimately take long
- Check connectivity/latency to the remote ordering node (ping, TLS handshake, firewall rules)
- Restart or repair the unresponsive ordering node
- Verify the cluster endpoint list contains reachable nodes so the puller can fail over
Defensive patterns
Strategy: retry
Validate before calling
conn, err := grpc.DialContext(ctx, endpoint, grpc.WithBlock(), grpc.WithTimeout(waitTimeout))
if err != nil { return fmt.Errorf("endpoint unreachable before Recv: %w", err) } Try / catch
resp, err := stream.Recv()
if err != nil {
if strings.Contains(err.Error(), "didn't receive a response within") {
// treat as timeout: cancel and retry on another endpoint
}
return err
} Prevention
- Size waitTimeout above worst-case block delivery latency
- Monitor network latency and packet loss between orderers
- Set liveness/health checks on ordering nodes
- Fail over endpoints promptly on timeouts
When it happens
Trigger: Recv is called on an impatient stream and the remote endpoint doesn't produce any response within the configured wait timeout (e.g. RequestTimeout / puller timeout settings); the network drops packets after connection establishment; the remote node hangs processing the seek.
Common situations: Slow or saturated ordering node under heavy consensus load; network partition or firewall silently dropping the gRPC stream; misconfigured timeout values too small for large block pulls; node dead but TCP connection not yet closed.
Related errors
- timeout waiting for channel creation
- connection to %d(%s) is in state %s
- orderer `%s` hung up without sending status
- ordering service endpoint %s is not valid or missing
- failed sending proposal, due to %s
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/a98981351c4780a9.
Report an issue: GitHub.