hyperledger/fabric · error
required to disseminate to at least
Error message
required to disseminate to at least %d peers, but know of only %d eligible peers
What it means
Since FAB-15389 the check runs before disseminating: the number of eligible peers on the channel must be at least RequiredPeerCount of the collection policy. If fewer peers qualify, dissemination cannot satisfy the policy and fails fast.
Solutions
- Lower requiredPeerCount (and maxPeerCount) in the collection definition to fit the deployed network size
- Ensure enough peers of the member orgs are running, joined to the channel, and connected via gossip
- Wait for gossip membership to converge / fix gossip bootstrap if peers know of no one
Example fix
// before (collections_config.json) "requiredPeerCount": 3, // after (only 2 eligible peers exist) "requiredPeerCount": 1
Defensive patterns
Strategy: validation
Validate before calling
if uint32(len(eligiblePeers)) < requiredPeerCount {
return fmt.Errorf("need %d peers, have %d", requiredPeerCount, len(eligiblePeers))
} Try / catch
if err != nil && strings.Contains(err.Error(), "eligible peers") {
// scale network or lower requiredPeerCount
} Prevention
- Set requiredPeerCount no higher than the smallest collection org's peer count
- Monitor gossip membership; ensure collection-member peers stay up
When it happens
Trigger: disseminationPlanForMsg finds len(eligiblePeers) < colAP.RequiredPeerCount() — the channel membership after the collection's routing filter is smaller than the policy's required peer count.
Common situations: Small network or many peers down so too few peers in the collection's member orgs are connected; RequiredPeerCount configured higher than the number of orgs/peers in the collection; gossip membership not yet converged at startup.
Related errors
- Empty membership
- collection config package for
- configHistoryRetriever is not available
- Could not obtain collection access policy, collection name
- Failed disseminating
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/b633d107b5aa0354.
Report an issue: GitHub.
Appendix: source
Thrown at gossip/privdata/distributor.go:238
return colFilter(protoutil.SignedData{
Data: signature.Message,
Signature: signature.Signature,
Identity: signature.PeerIdentity,
})
})
if err != nil {
d.logger.Error("Failed to retrieve peer routing filter for channel", d.chainID, ":", err)
return nil, err
}
m := pvtDataMsg.GetPrivateData().Payload
eligiblePeers := d.eligiblePeersOfChannel(routingFilter)
// With the shift to per peer dissemination in FAB-15389, we must first check
// that there are enough eligible peers to satisfy RequiredPeerCount.
if len(eligiblePeers) < colAP.RequiredPeerCount() {
return nil, errors.Errorf("required to disseminate to at least %d peers, but know of only %d eligible peers", colAP.RequiredPeerCount(), len(eligiblePeers))
}
// Group eligible peers by org so that we can disseminate across orgs first
identitySetsByOrg := d.identitiesOfEligiblePeersByOrg(eligiblePeers, colAP)
// peerEndpoints are used for dissemination debug only
peerEndpoints := map[string]string{}
for _, peer := range eligiblePeers {
epToAdd := peer.Endpoint
if epToAdd == "" {
epToAdd = peer.InternalEndpoint
}
peerEndpoints[string(peer.PKIid)] = epToAdd
}
// Initialize maximumPeerRemainingCount and requiredPeerRemainingCount,
// these will be decremented until we've selected enough peers for dissemination
maximumPeerRemainingCount := colAP.MaximumPeerCount()View on GitHub (pinned to 2736b63f8f)