{"record":{"id":"3d5141f0bd000521","repo":"hyperledger/fabric","slug":"faulty-node-received-v","errorCode":null,"errorMessage":"faulty node, received: %v","messagePattern":"faulty node, received: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"orderer/common/cluster/deliver.go","lineNumber":478,"sourceCode":"\t\t}\n\t\tif block.Data == nil {\n\t\t\treturn nil, errors.New(\"block data is nil\")\n\t\t}\n\t\tif block.Header == nil {\n\t\t\treturn nil, errors.New(\"block header is nil\")\n\t\t}\n\t\tif block.Metadata == nil || len(block.Metadata.Metadata) == 0 {\n\t\t\treturn nil, errors.New(\"block metadata is empty\")\n\t\t}\n\t\treturn block, nil\n\tcase *orderer.DeliverResponse_Status:\n\t\tif t.Status == common.Status_FORBIDDEN {\n\t\t\treturn nil, ErrForbidden\n\t\t}\n\t\tif t.Status == common.Status_SERVICE_UNAVAILABLE {\n\t\t\treturn nil, ErrServiceUnavailable\n\t\t}\n\t\treturn nil, errors.Errorf(\"faulty node, received: %v\", resp)\n\tdefault:\n\t\treturn nil, errors.Errorf(\"response is of type %v, but expected a block\", reflect.TypeOf(resp.Type))\n\t}\n}\n\nfunc (p *BlockPuller) seekLastEnvelope() (*common.Envelope, error) {\n\treturn protoutil.CreateSignedEnvelopeWithTLSBinding(\n\t\tcommon.HeaderType_DELIVER_SEEK_INFO,\n\t\tp.Channel,\n\t\tp.Signer,\n\t\tlast(),\n\t\tint32(0),\n\t\tuint64(0),\n\t\tutil.ComputeSHA256(p.TLSCert),\n\t)\n}\n\nfunc (p *BlockPuller) seekNextEnvelope(startSeq uint64) (*common.Envelope, error) {","sourceCodeStart":460,"sourceCodeEnd":496,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/orderer/common/cluster/deliver.go#L460-L496","documentation":"extractBlockFromResponse in the cluster BlockPuller returns this when an ordering node's Deliver response is neither a block nor a recognized error status — the response status is something other than SUCCESS, FORBIDDEN, or SERVICE_UNAVAILABLE. It signals the node misbehaved or the channel/TLS state is broken, and the puller will treat the endpoint as faulty and fail over to another one.","triggerScenarios":"A DeliverResponse arrives with a Status other than common.Status_SUCCESS, Status_FORBIDDEN, or Status_SERVICE_UNAVAILABLE (e.g. BAD_REQUEST from an incompatible SeekInfo, or a node rejecting the seek); any non-DeliverResponse shape reaching the extractor.","commonSituations":"Fabric version mismatch between the pulling orderer and the remote ordering node; a consenter removed from the channel still listed in the cluster configuration; misconfigured mutual TLS causing the remote node to reject the deliver seek; pointing the puller at a non-orderer gRPC endpoint.","solutions":["Verify all ordering nodes run compatible Fabric versions and share the channel configuration","Check the remote node's logs for why the deliver request was rejected (status logged in the response)","Confirm mutual TLS certificates and TLSRootCAs are correctly configured for the cluster connection","Ensure the pulling node is actually a member of the channel with a valid identity"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"if resp.GetType() != orderer.DeliverResponse_BLOCK { return fmt.Errorf(\"non-block response type: %v\", resp.Type) }","typeGuard":"func isBlockResponse(resp *orderer.DeliverResponse) bool { return resp != nil && resp.GetType() == orderer.DeliverResponse_BLOCK }","tryCatchPattern":"resp, err := puller.PullBlock(seq)\nif err != nil {\n    if errors.Is(err, cluster.ErrForbidden) || errors.Is(err, cluster.ErrServiceUnavailable) {\n        // fail over / retry another endpoint\n    }\n    return err\n}","preventionTips":["Keep Fabric versions aligned across ordering nodes","Maintain correct mutual TLS and root CA configuration","Ensure cluster endpoints point at current channel consenters","Monitor orderer logs for non-SUCCESS deliver statuses"],"tags":["fabric","orderer","raft","consensus"],"backgroundTag":"unexpected-deliver-response","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"}