hyperledger/fabric · error
timed out waiting for connection to deliver on all peers
Error message
timed out waiting for connection to deliver on all peers
What it means
DeliverGroup.Connect waits for all peers' deliver clients to register for events, bounded by the CLI timeout (--waitForEventTimeout, default 30s). If the context expires before every peer's connection is ready, this error is returned.
Source
Thrown at internal/peer/chaincode/common.go:663
// the peer's deliver service, receive an error, or for the context
// to timeout. An error will be returned whenever even a single
// deliver client fails to connect to its peer
func (dg *DeliverGroup) Connect(ctx context.Context) error {
dg.wg.Add(len(dg.Clients))
for _, client := range dg.Clients {
go dg.ClientConnect(ctx, client)
}
readyCh := make(chan struct{})
go dg.WaitForWG(readyCh)
select {
case <-readyCh:
if dg.Error != nil {
err := errors.WithMessage(dg.Error, "failed to connect to deliver on all peers")
return err
}
case <-ctx.Done():
err := errors.New("timed out waiting for connection to deliver on all peers")
return err
}
return nil
}
// ClientConnect sends a deliver seek info envelope using the
// provided deliver client, setting the deliverGroup's Error
// field upon any error
func (dg *DeliverGroup) ClientConnect(ctx context.Context, dc *DeliverClient) {
defer dg.wg.Done()
df, err := dc.Client.DeliverFiltered(ctx)
if err != nil {
err = errors.WithMessagef(err, "error connecting to deliver filtered at %s", dc.Address)
dg.setError(err)
return
}
defer df.CloseSend()View on GitHub (pinned to 2736b63f8f)
Solutions
- Verify every peer in --peerAddresses is up and reachable (docker ps / ping / peer node status)
- Correct --tlsRootCertFiles for each peer (order and count must match peerAddresses)
- Increase --waitForEventTimeout (e.g. --waitForEventTimeout 120s) or drop --waitForEvent if event confirmation is not required
- Check peer logs for deliver service/TLS handshake errors
Example fix
// before peer chaincode invoke ... --waitForEvent # default 30s timeout // after peer chaincode invoke ... --waitForEvent --waitForEventTimeout 120s
Defensive patterns
Strategy: retry
Validate before calling
// pre-check each peer before invoke
for _, addr := range peerAddresses {
if !isPeerReachable(addr) { return fmt.Errorf("peer %s unreachable; remove or fix it", addr) }
} Try / catch
if strings.Contains(err.Error(), "timed out waiting for connection to deliver") {
// retry once with larger timeout, or rerun without --waitForEvent
return invokeWithTimeout(ctx, 120*time.Second)
} Prevention
- Keep --tlsRootCertFiles aligned 1:1 with --peerAddresses order
- Health-check peers before scripted invokes
- Size --waitForEventTimeout to your network's worst-case latency
When it happens
Trigger: Running invoke with --waitForEvent enabled while one or more peers fail to establish a deliver connection (peer down, TLS/mTLS misconfigured, network partition, slow peer) within the timeout.
Common situations: A peer in --peerAddresses list is stopped or unreachable; wrong --tlsRootCertFiles for a peer; overloaded peers under load tests; timeouts too small for slow networks.
Understand the failure class
- Timeouts: ETIMEDOUT, deadlines, and hung requests — what actually expires when a request times out.
Related errors
- timed out waiting for txid on all peers
- context finished before block retrieved
- deliver completed with status (%s) before txid received
- received unexpected response type (%T) from %s
- timeout waiting for channel creation
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/8b725c8851467594.
Report an issue: GitHub.