{"record":{"id":"9e14c3a98176ba0f","repo":"hyperledger/fabric","slug":"error-receiving","errorCode":null,"errorMessage":"error receiving","messagePattern":"error receiving","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/peer/common/deliverclient.go","lineNumber":70,"sourceCode":"\t}\n\tenv := seekHelper(d.ChannelID, seekPosition, d.TLSCertHash, d.Signer, d.BestEffort)\n\treturn d.Service.Send(env)\n}\n\nfunc (d *DeliverClient) seekOldest() error {\n\tenv := seekHelper(d.ChannelID, seekOldest, d.TLSCertHash, d.Signer, d.BestEffort)\n\treturn d.Service.Send(env)\n}\n\nfunc (d *DeliverClient) seekNewest() error {\n\tenv := seekHelper(d.ChannelID, seekNewest, d.TLSCertHash, d.Signer, d.BestEffort)\n\treturn d.Service.Send(env)\n}\n\nfunc (d *DeliverClient) readBlock() (*cb.Block, error) {\n\tmsg, err := d.Service.Recv()\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"error receiving\")\n\t}\n\tswitch t := msg.Type.(type) {\n\tcase *ab.DeliverResponse_Status:\n\t\tlogger.Infof(\"Expect block, but got status: %v\", t)\n\t\treturn nil, errors.Errorf(\"can't read the block: %v\", t)\n\tcase *ab.DeliverResponse_Block:\n\t\tlogger.Infof(\"Received block: %v\", t.Block.Header.Number)\n\t\tif resp, err := d.Service.Recv(); err != nil { // Flush the success message\n\t\t\tlogger.Errorf(\"Failed to flush success message: %s\", err)\n\t\t} else if status := resp.GetStatus(); status != cb.Status_SUCCESS {\n\t\t\tlogger.Errorf(\"Expect status to be SUCCESS, got: %s\", status)\n\t\t}\n\n\t\treturn t.Block, nil\n\tdefault:\n\t\treturn nil, errors.Errorf(\"response error: unknown type %T\", t)\n\t}\n}","sourceCodeStart":52,"sourceCodeEnd":88,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/internal/peer/common/deliverclient.go#L52-L88","documentation":"readBlock blocks on the deliver gRPC stream; Recv returned a transport error, which is wrapped with \"error receiving\". The client never received a deliver response (status or block) because the stream broke or the server closed it.","triggerScenarios":"d.Service.Recv() on the atomic broadcast/deliver stream fails — connection dropped, TLS handshake failure, context timeout/cancellation, or server closed the stream.","commonSituations":"Orderer/peer unreachable mid-stream, idle connections killed by a proxy, TLS cert mismatch, or deliver request rejected leading to stream teardown.","solutions":["Verify connectivity and TLS settings to the orderer/peer (certs, host overrides)","Retry fetching the block; deliver streams are often transiently interrupted","Check server-side logs for why the stream was closed","Increase timeouts and ensure the deliver envelope was accepted (Send succeeded) before Recv"],"exampleFix":"// before\nblock, err := deliverClient.GetNewestBlock()\n// after\nblock, err := deliverClient.GetNewestBlock()\nif err != nil && strings.Contains(err.Error(), \"error receiving\") { block, err = retryFetch() }","handlingStrategy":"retry","validationCode":"// pre-check connectivity\nconn, err := grpc.DialContext(ctx, addr, grpc.WithTransportCredentials(creds), grpc.WithBlock())\nif err != nil { return fmt.Errorf(\"orderer/peer unreachable: %w\", err) }","typeGuard":null,"tryCatchPattern":"block, err := client.GetNewestBlock()\nif err != nil {\n    if strings.Contains(err.Error(), \"error receiving\") {\n        time.Sleep(backoff)\n        block, err = client.GetNewestBlock()\n    }\n}","preventionTips":["Enable gRPC keepalives for long-lived deliver streams","Validate TLS certs and host overrides up front","Set sane deadlines and retry with backoff"],"tags":["fabric","grpc","deliver","stream-error"],"backgroundTag":"grpc-stream-receive-failed","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"}