{"record":{"id":"9cf8898466503e25","repo":"hyperledger/fabric","slug":"could-not-find-msp-manager-for-channel-s","errorCode":null,"errorMessage":"could not find MSP manager for channel %s","messagePattern":"could not find MSP manager for channel (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"discovery/support/acl/support.go","lineNumber":95,"sourceCode":"\tconf := s.GetChannelConfig(channel)\n\tif conf == nil {\n\t\tlogger.Panic(\"Failed obtaining channel config for channel\", channel)\n\t}\n\tv := conf.ConfigtxValidator()\n\tif v == nil {\n\t\tlogger.Panic(\"ConfigtxValidator for channel\", channel, \"is nil\")\n\t}\n\treturn v.Sequence()\n}\n\nfunc (s *DiscoverySupport) SatisfiesPrincipal(channel string, rawIdentity []byte, principal *msp.MSPPrincipal) error {\n\tconf := s.GetChannelConfig(channel)\n\tif conf == nil {\n\t\treturn errors.Errorf(\"channel %s doesn't exist\", channel)\n\t}\n\tmspMgr := conf.MSPManager()\n\tif mspMgr == nil {\n\t\treturn errors.Errorf(\"could not find MSP manager for channel %s\", channel)\n\t}\n\tidentity, err := mspMgr.DeserializeIdentity(rawIdentity)\n\tif err != nil {\n\t\tlogger.Warnw(\"failed deserializing identity\", \"error\", err, \"identity\", protoutil.LogMessageForSerializedIdentity(rawIdentity))\n\t\treturn errors.Wrap(err, \"failed deserializing identity\")\n\t}\n\treturn identity.SatisfiesPrincipal(principal)\n}\n\n// ChannelPolicyManagerGetter is a support interface\n// to get access to the policy manager of a given channel\ntype ChannelPolicyManagerGetter interface {\n\t// Returns the policy manager associated to the passed channel\n\t// and true if it was the manager requested, or false if it is the default manager\n\tManager(channelID string) policies.Manager\n}\n\n// NewChannelVerifier returns a new channel verifier from the given policy and policy manager getter","sourceCodeStart":77,"sourceCodeEnd":113,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/discovery/support/acl/support.go#L77-L113","documentation":"The channel config exists but its MSPManager is nil, so the discovery service cannot deserialize the requesting identity to run the principal check. The MSP manager is what binds channel config to identity validation; without it no ACL evaluation is possible.","triggerScenarios":"SatisfiesPrincipal invoked on a channel whose config block was loaded but whose MSP manager failed to initialize (e.g. channel config missing the Application/Organization MSP definitions).","commonSituations":"Corrupted or partial channel configuration; MSP definitions removed from the channel config; internal misconfiguration of the peer's channel config cache after a bad config update.","solutions":["Check the peer logs for MSP manager initialization errors for that channel","Ensure the channel config includes valid MSP definitions for all organizations (configtxgen output correct)","Re-create or update the channel configuration so each org's MSP is present, then have the peer rejoin/re-fetch config"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// check peer health/config load before discovery\nif err := peerHealthCheck(peerEndpoint); err != nil {\n    return err\n}","typeGuard":null,"tryCatchPattern":"err := retry.Do(func() error {\n    res, err := client.Send(ctx, req)\n    if err != nil && strings.Contains(err.Error(), \"MSP manager\") {\n        return retry.RetryableError(err) // transient config load\n    }\n    return err\n})","preventionTips":["Keep channel configs with complete MSP definitions for all orgs","Watch peer logs for MSP init failures after channel joins","Avoid hand-editing channel config blocks"],"tags":["fabric","msp","channel","authorization"],"backgroundTag":"missing-msp-manager","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"}