{"record":{"id":"e72c23bc5724d06a","repo":"hyperledger/fabric","slug":"failed-obtaining-collection-filter-for-channel-s","errorCode":null,"errorMessage":"Failed obtaining collection filter for channel %s, chaincode %s, collection %s","messagePattern":"Failed obtaining collection filter for channel (.+?), chaincode (.+?), collection (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"gossip/privdata/pull.go","lineNumber":544,"sourceCode":"\t}\n\treturn filters, nil\n}\n\nfunc (p *puller) getLatestCollectionConfigRoutingFilter(chaincode string, collection string) (filter.RoutingFilter, error) {\n\tcc := privdata.CollectionCriteria{\n\t\tChannel:    p.channel,\n\t\tCollection: collection,\n\t\tNamespace:  chaincode,\n\t}\n\n\tlatestCollectionConfig, err := p.cs.RetrieveCollectionAccessPolicy(cc)\n\tif err != nil {\n\t\treturn nil, errors.WithMessagef(err, \"failed obtaining collection policy for channel %s, chaincode %s, config %s\", p.channel, chaincode, collection)\n\t}\n\n\tfilt := latestCollectionConfig.AccessFilter()\n\tif filt == nil {\n\t\treturn nil, errors.Errorf(\"Failed obtaining collection filter for channel %s, chaincode %s, collection %s\", p.channel, chaincode, collection)\n\t}\n\n\tanyPeerInCollection, err := p.getMatchAllRoutingFilter(filt)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn anyPeerInCollection, nil\n}\n\nfunc (p *puller) getMatchAllRoutingFilter(filt privdata.Filter) (filter.RoutingFilter, error) {\n\troutingFilter, err := p.PeerFilter(common.ChannelID(p.channel), func(peerSignature api.PeerSignature) bool {\n\t\treturn filt(protoutil.SignedData{\n\t\t\tSignature: peerSignature.Signature,\n\t\t\tIdentity:  peerSignature.PeerIdentity,\n\t\t\tData:      peerSignature.Message,\n\t\t})\n\t})","sourceCodeStart":526,"sourceCodeEnd":562,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/gossip/privdata/pull.go#L526-L562","documentation":"getLatestCollectionConfigRoutingFilter fetches the latest collection config and its access filter. If the latest config's AccessFilter() is nil, the puller cannot compute peers to ask for the missing private data and returns this error.","triggerScenarios":"Called from computeFilters or computeReconciliationFilters when the latest collection access policy for (channel, chaincode, collection) yields a nil AccessFilter.","commonSituations":"Collection removed in the latest config but old missing data still tracked; malformed member orgs policy in the newest collection definition; cache returning an incomplete policy object.","solutions":["Ensure the latest collection config defines a valid member_orgs_policy that produces an access filter","If the collection was deleted, purge/ignore missing-data entries for it","Check upstream wrapped error 'failed obtaining collection policy' for the root cause"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":"pol, err := cs.RetrieveCollectionAccessPolicy(channel, cc)\nif err == nil && pol.AccessFilter() == nil { skip() }","typeGuard":"func filterable(pol privdata.CollectionAccessPolicy) bool { return pol != nil && pol.AccessFilter() != nil }","tryCatchPattern":null,"preventionTips":["Keep latest collection configs valid (non-empty member orgs policy)","Purge missing-data entries when a collection is deleted"],"tags":["hyperledger-fabric","gossip","private-data","nil-filter"],"backgroundTag":"nil-collection-filter","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"}