{"record":{"id":"9bbed3e808ab0256","repo":"hyperledger/fabric","slug":"received-unexpected-response-type-t-from-s","errorCode":null,"errorMessage":"received unexpected response type (%T) from %s","messagePattern":"received unexpected response type \\(%T\\) from (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/peer/chaincode/common.go","lineNumber":750,"sourceCode":"\t\tswitch r := resp.Type.(type) {\n\t\tcase *pb.DeliverResponse_FilteredBlock:\n\t\t\tfilteredTransactions := r.FilteredBlock.FilteredTransactions\n\t\t\tfor _, tx := range filteredTransactions {\n\t\t\t\tif tx.Txid == dg.TxID {\n\t\t\t\t\tlogger.Infof(\"txid [%s] committed with status (%s) at %s\", dg.TxID, tx.TxValidationCode, dc.Address)\n\t\t\t\t\tif tx.TxValidationCode != pb.TxValidationCode_VALID {\n\t\t\t\t\t\terr = errors.Errorf(\"transaction invalidated with status (%s)\", tx.TxValidationCode)\n\t\t\t\t\t\tdg.setError(err)\n\t\t\t\t\t}\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\tcase *pb.DeliverResponse_Status:\n\t\t\terr = errors.Errorf(\"deliver completed with status (%s) before txid received\", r.Status)\n\t\t\tdg.setError(err)\n\t\t\treturn\n\t\tdefault:\n\t\t\terr = errors.Errorf(\"received unexpected response type (%T) from %s\", r, dc.Address)\n\t\t\tdg.setError(err)\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// WaitForWG waits for the deliverGroup's wait group and closes\n// the channel when ready\nfunc (dg *DeliverGroup) WaitForWG(readyCh chan struct{}) {\n\tdg.wg.Wait()\n\tclose(readyCh)\n}\n\n// setError serializes an error for the deliverGroup\nfunc (dg *DeliverGroup) setError(err error) {\n\tdg.mutex.Lock()\n\tdg.Error = err\n\tdg.mutex.Unlock()","sourceCodeStart":732,"sourceCodeEnd":768,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/internal/peer/chaincode/common.go#L732-L768","documentation":"ClientWait's switch handles FilteredBlock and Status deliver responses; any other response type (e.g. a full Block when filtered deliver was expected) falls into the default case and is reported as unexpected for the given peer address.","triggerScenarios":"The deliver server sends a response type outside the expected set — usually a protocol/registration mismatch, e.g. registering for full-block deliver but receiving Block responses in a code path expecting filtered blocks, or a Fabric version mismatch between CLI and peer.","commonSituations":"Mixed-version Fabric networks (CLI older/newer than peer); custom deliver intermediaries/proxies; bugs in new response types introduced by upgrades.","solutions":["Align CLI and peer versions (same Fabric release line)","Check whether a proxy or intermediary is rewriting deliver responses","Inspect peer logs for the delivered response type; report a bug to Fabric if stock versions reproduce it"],"exampleFix":"// before\n// CLI v1.4 (unfiltered deliver) talking to v2.x peer\n// after\n// upgrade CLI binaries to match peer version\npeer version  # ensure 2.x matches peers, then retry","handlingStrategy":"retry","validationCode":"if cliVersionMajor != peerVersionMajor {\n    return fmt.Errorf(\"CLI (%s) and peer (%s) versions must match\", cliVersion, peerVersion)\n}","typeGuard":null,"tryCatchPattern":"if strings.Contains(err.Error(), \"received unexpected response type\") {\n    // protocol mismatch: upgrade CLI/peer to matching versions and retry\n    return retryAfterVersionAlignment(ctx)\n}","preventionTips":["Keep all Fabric binaries (peer CLI, peers, orderers) on the same release","Avoid proxies that modify deliver streams","Test deliver event handling after every Fabric upgrade"],"tags":["fabric","deliver","protocol-mismatch","version-skew"],"backgroundTag":"unexpected-deliver-response-type","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"}