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

  1. Increase the relevant timeout configuration (e.g. General.Cluster.SendBufferSize / deliver request timeout) if pulls legitimately take long
  2. Check connectivity/latency to the remote ordering node (ping, TLS handshake, firewall rules)
  3. Restart or repair the unresponsive ordering node
  4. 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

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


AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04). Data as JSON: /api/errors/a98981351c4780a9. Report an issue: GitHub.