{"record":{"id":"8ed0272952d0d811","repo":"hyperledger/fabric","slug":"channel-s-doesn-t-exist-8ed027","errorCode":null,"errorMessage":"channel %s doesn't exist","messagePattern":"channel (.+?) doesn't exist","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"orderer/consensus/smartbft/ingress.go","lineNumber":48,"sourceCode":"\tReceiverByChain(channelID string) MessageReceiver\n}\n\ntype WarningLogger interface {\n\tWarningf(template string, args ...any)\n}\n\n// Ingress dispatches Submit and Step requests to the designated per chain instances\ntype Ingress struct {\n\tLogger        WarningLogger\n\tChainSelector ReceiverGetter\n}\n\n// OnConsensus notifies the Ingress for a reception of a StepRequest from a given sender on a given channel\nfunc (in *Ingress) OnConsensus(channel string, sender uint64, request *ab.ConsensusRequest) error {\n\treceiver := in.ChainSelector.ReceiverByChain(channel)\n\tif receiver == nil {\n\t\tin.Logger.Warningf(\"An attempt to send a consensus request to a non existing channel (%s) was made by %d\", channel, sender)\n\t\treturn errors.Errorf(\"channel %s doesn't exist\", channel)\n\t}\n\tmsg := &protos.Message{}\n\tif err := proto.Unmarshal(request.Payload, msg); err != nil {\n\t\tin.Logger.Warningf(\"Malformed message: %v\", err)\n\t\treturn errors.Wrap(err, \"malformed message\")\n\t}\n\treceiver.HandleMessage(sender, msg)\n\treturn nil\n}\n\n// OnSubmit notifies the Ingress for a reception of a SubmitRequest from a given sender on a given channel\nfunc (in *Ingress) OnSubmit(channel string, sender uint64, request *ab.SubmitRequest) error {\n\treceiver := in.ChainSelector.ReceiverByChain(channel)\n\tif receiver == nil {\n\t\tin.Logger.Warningf(\"An attempt to submit a transaction to a non existing channel (%s) was made by %d\", channel, sender)\n\t\treturn errors.Errorf(\"channel %s doesn't exist\", channel)\n\t}\n\treceiver.HandleRequest(sender, protoutil.MarshalOrPanic(request.Payload))","sourceCodeStart":30,"sourceCodeEnd":66,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/orderer/consensus/smartbft/ingress.go#L30-L66","documentation":"The cluster ingress dispatcher routes incoming ConsensusRequest messages to the in-memory chain registered for the target channel via ChainSelector.ReceiverByChain. If no chain/follower exists locally for that channel name, this error is returned to the remote sender, indicating consensus traffic addressed to a channel this orderer has not joined (or has since left).","triggerScenarios":"A remote consenter sends an ab.ConsensusRequest on a channel for which this node has no active chain (never joined via osnadmin, chain failed to start, or the channel was removed) — OnConsensus finds receiver == nil.","commonSituations":"Cluster nodes with inconsistent channel membership (one node joined, others not); channel just removed locally while peers still route to it; typo/mismatch in channel ID during osnadmin operations; chain creation failed earlier so the receiver map is empty.","solutions":["Join the orderer to the channel with the latest config block (osnadmin channel join) so the receiver is registered","Verify the channel ID in the request matches the joined channel name exactly (no typos)","Check orderer logs for earlier chain-start failures (e.g. BFTChain creation errors) that left the channel unregistered, and fix the root cause","Ensure all cluster members have consistent channel membership; remove the channel from nodes that shouldn't serve it"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// Sender-side: verify the target channel is joined locally before sending consensus traffic\nif receiverByChain(channelID) == nil {\n    return fmt.Errorf(\"not joined to channel %s; join before exchanging consensus messages\", channelID)\n}","typeGuard":null,"tryCatchPattern":"err := ingress.OnConsensus(channel, sender, req)\nif err != nil && strings.Contains(err.Error(), \"doesn't exist\") {\n    log.Warnf(\"consensus msg for unknown channel %s from %d; dropping\", channel, sender)\n    // do not retry: join the channel first or stop routing traffic to this node\n}","preventionTips":["Keep channel membership consistent across all ordering nodes","Join every node to every channel it is a consenter of","After removing a channel, update routing/DNS so traffic stops","Alert on this error in logs — it usually signals membership drift"],"tags":["fabric","smartbft","network","routing","cluster"],"backgroundTag":"channel-not-found","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"}