hyperledger/fabric · error
required to disseminate to at least %d peers, but know of on
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.
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)
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
- membership is empty
- collection config package for %s chaincode is not provided
- Could not obtain collection access policy, collection name %
- No collection access policy filter computed for %v
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/b633d107b5aa0354.
Report an issue: GitHub.