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

  1. Verify every peer in --peerAddresses is up and reachable (docker ps / ping / peer node status)
  2. Correct --tlsRootCertFiles for each peer (order and count must match peerAddresses)
  3. Increase --waitForEventTimeout (e.g. --waitForEventTimeout 120s) or drop --waitForEvent if event confirmation is not required
  4. 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

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

Related errors


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