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

  1. Lower requiredPeerCount (and maxPeerCount) in the collection definition to fit the deployed network size
  2. Ensure enough peers of the member orgs are running, joined to the channel, and connected via gossip
  3. 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

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


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