{"record":{"id":"8b725c8851467594","repo":"hyperledger/fabric","slug":"timed-out-waiting-for-connection-to-deliver-on-all","errorCode":null,"errorMessage":"timed out waiting for connection to deliver on all peers","messagePattern":"timed out waiting for connection to deliver on all peers","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/peer/chaincode/common.go","lineNumber":663,"sourceCode":"// the peer's deliver service, receive an error, or for the context\n// to timeout. An error will be returned whenever even a single\n// deliver client fails to connect to its peer\nfunc (dg *DeliverGroup) Connect(ctx context.Context) error {\n\tdg.wg.Add(len(dg.Clients))\n\tfor _, client := range dg.Clients {\n\t\tgo dg.ClientConnect(ctx, client)\n\t}\n\treadyCh := make(chan struct{})\n\tgo dg.WaitForWG(readyCh)\n\n\tselect {\n\tcase <-readyCh:\n\t\tif dg.Error != nil {\n\t\t\terr := errors.WithMessage(dg.Error, \"failed to connect to deliver on all peers\")\n\t\t\treturn err\n\t\t}\n\tcase <-ctx.Done():\n\t\terr := errors.New(\"timed out waiting for connection to deliver on all peers\")\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// ClientConnect sends a deliver seek info envelope using the\n// provided deliver client, setting the deliverGroup's Error\n// field upon any error\nfunc (dg *DeliverGroup) ClientConnect(ctx context.Context, dc *DeliverClient) {\n\tdefer dg.wg.Done()\n\tdf, err := dc.Client.DeliverFiltered(ctx)\n\tif err != nil {\n\t\terr = errors.WithMessagef(err, \"error connecting to deliver filtered at %s\", dc.Address)\n\t\tdg.setError(err)\n\t\treturn\n\t}\n\tdefer df.CloseSend()","sourceCodeStart":645,"sourceCodeEnd":681,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/internal/peer/chaincode/common.go#L645-L681","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":"// before\npeer chaincode invoke ... --waitForEvent  # default 30s timeout\n// after\npeer chaincode invoke ... --waitForEvent --waitForEventTimeout 120s","handlingStrategy":"retry","validationCode":"// pre-check each peer before invoke\nfor _, addr := range peerAddresses {\n    if !isPeerReachable(addr) { return fmt.Errorf(\"peer %s unreachable; remove or fix it\", addr) }\n}","typeGuard":null,"tryCatchPattern":"if strings.Contains(err.Error(), \"timed out waiting for connection to deliver\") {\n    // retry once with larger timeout, or rerun without --waitForEvent\n    return invokeWithTimeout(ctx, 120*time.Second)\n}","preventionTips":["Keep --tlsRootCertFiles aligned 1:1 with --peerAddresses order","Health-check peers before scripted invokes","Size --waitForEventTimeout to your network's worst-case latency"],"tags":["fabric","deliver","timeout","peer-connectivity"],"backgroundTag":"deliver-connection-timeout","analyzedSha":"2736b63f8fd5932511d56fe68b7039d15977f7f6","analyzedAt":"2026-09-04T08:52:36.465Z","contentChangedAt":"2026-09-04T08:52:36.465Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}