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

  1. Check the stored original collection config snapshot for the missing data is valid and its MemberOrgsPolicy is well-formed
  2. Re-verify the collection config history on the channel; update reconciliation scope or drop unobtainable data
  3. 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

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


AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04). Data as JSON: /api/errors/439b6d66308b8c78. Report an issue: GitHub.