hyperledger/fabric · error
Failed obtaining original collection filter for channel %s,
Error message
Failed obtaining original collection filter for channel %s, config %s
What it means
During reconciliation, the puller needs the routing filter of the collection config as it existed when the missing data was created (from the digest's collection config). If AccessFilter on that original config's MemberOrgsPolicy returns nil, it cannot determine which peers may hold the data.
Source
Thrown at gossip/privdata/pull.go:507
}
}
return filters, nil
}
func (p *puller) computeReconciliationFilters(dig2collectionConfig privdatacommon.Dig2CollectionConfig) (digestToFilterMapping, error) {
filters := make(map[privdatacommon.DigKey]collectionRoutingFilter)
for digest, originalCollectionConfig := range dig2collectionConfig {
anyPeerInCollection, err := p.getLatestCollectionConfigRoutingFilter(digest.Namespace, digest.Collection)
if err != nil {
return nil, err
}
originalConfigFilter, err := p.cs.AccessFilter(p.channel, originalCollectionConfig.MemberOrgsPolicy)
if err != nil {
return nil, err
}
if originalConfigFilter == nil {
return nil, errors.Errorf("Failed obtaining original collection filter for channel %s, config %s", p.channel, digest.Collection)
}
// get peers that were in the collection config while the missing data was created
peerFromDataCreation, err := p.getMatchAllRoutingFilter(originalConfigFilter)
if err != nil {
return nil, err
}
// prefer peers that are in the collection from the time the data was created rather than ones that were added later.
// the assumption is that the longer the peer is in the collection config, the chances it has the data are bigger.
preferredPeer := func(member discovery.NetworkMember) bool {
return peerFromDataCreation(member) && anyPeerInCollection(member)
}
filters[digest] = collectionRoutingFilter{
anyPeer: anyPeerInCollection,
preferredPeer: preferredPeer,
}View on GitHub (pinned to 2736b63f8f)
Solutions
- Check the stored original collection config snapshot for the missing data is valid and its MemberOrgsPolicy is well-formed
- Re-verify the collection config history on the channel; update reconciliation scope or drop unobtainable data
- Fix the collectionAccessStore (cs) so it returns the correct historical config
Defensive patterns
Strategy: fallback
Validate before calling
if originalCollectionConfig == nil || originalCollectionConfig.MemberOrgsPolicy == nil { skipDigest() } Type guard
func validOriginalConfig(c *peer.StaticCollectionConfig) bool { return c != nil && c.MemberOrgsPolicy != nil } Prevention
- Preserve valid historical collection config snapshots with missing data
- Avoid removing collections that still have un-reconciled pvtdata
When it happens
Trigger: computeReconciliationFilters processes a reconciliation digest whose stored/original collection config yields a nil filter from p.cs.AccessFilter(channel, MemberOrgsPolicy).
Common situations: Missing pvtdata from a collection whose config was later modified or removed; stale/invalid stored collection config snapshot; unsupported policy producing no filter.
Related errors
- No collection access policy filter computed for %v
- Failed obtaining collection filter for channel %s, chaincode
- got nil as MissingPvtDataTracker, exiting...
- purge private data is not enabled, channel application capab
- tx creator does not have read access permission on privateda
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/439b6d66308b8c78.
Report an issue: GitHub.