hyperledger/fabric · critical
peer.gossip.pvtData.implicitCollectionDisseminationPolicy.ma
Error message
peer.gossip.pvtData.implicitCollectionDisseminationPolicy.maxPeerCount (%d) cannot be less than requiredPeerCount (%d)
What it means
loadPrivDataConfig panics when implicit collection dissemination maxPeerCount is smaller than requiredPeerCount. You cannot require acknowledgments from more peers than you disseminate to, so the gossip privdata config validation fails fast at startup.
Source
Thrown at gossip/privdata/config.go:81
c.ReconcileBatchSize = reconcileBatchSizeDefault
}
c.ReconciliationEnabled = viper.GetBool("peer.gossip.pvtData.reconciliationEnabled")
requiredPeerCount := viper.GetInt("peer.gossip.pvtData.implicitCollectionDisseminationPolicy.requiredPeerCount")
maxPeerCount := implicitCollectionMaxPeerCountDefault
if viper.Get("peer.gossip.pvtData.implicitCollectionDisseminationPolicy.maxPeerCount") != nil {
// allow override maxPeerCount to 0 that will effectively disable dissemination on the peer
maxPeerCount = viper.GetInt("peer.gossip.pvtData.implicitCollectionDisseminationPolicy.maxPeerCount")
}
if requiredPeerCount < 0 {
panic(fmt.Sprintf("peer.gossip.pvtData.implicitCollectionDisseminationPolicy.requiredPeerCount (%d) cannot be less than zero",
requiredPeerCount))
}
if maxPeerCount < requiredPeerCount {
panic(fmt.Sprintf("peer.gossip.pvtData.implicitCollectionDisseminationPolicy.maxPeerCount (%d) cannot be less than requiredPeerCount (%d)",
maxPeerCount, requiredPeerCount))
}
c.ImplicitCollDisseminationPolicy.RequiredPeerCount = requiredPeerCount
c.ImplicitCollDisseminationPolicy.MaxPeerCount = maxPeerCount
}
View on GitHub (pinned to 2736b63f8f)
Solutions
- Raise maxPeerCount so it is >= requiredPeerCount
- If intentionally disabling dissemination, set both maxPeerCount and requiredPeerCount to 0
- Audit env overrides (CORE_PEER_GOSSIP_PVTDATA_IMPLICITCOLLDISSEMINATIONPOLICY_*) for conflicting values
Example fix
// before (core.yaml) implicitCollectionDisseminationPolicy: requiredPeerCount: 1 maxPeerCount: 0 // after implicitCollectionDisseminationPolicy: requiredPeerCount: 0 maxPeerCount: 0
Defensive patterns
Strategy: validation
Validate before calling
required := viper.GetInt("peer.gossip.pvtData.implicitCollectionDisseminationPolicy.requiredPeerCount")
max := viper.GetInt("peer.gossip.pvtData.implicitCollectionDisseminationPolicy.maxPeerCount")
if max < required {
return fmt.Errorf("maxPeerCount (%d) must be >= requiredPeerCount (%d)", max, required)
} Prevention
- Set both policy fields together; to disable dissemination set both to 0
- Check env overrides that may set only one of the two values
- Document the invariant maxPeerCount >= requiredPeerCount in your config templates
- Lint core.yaml values in CI
When it happens
Trigger: Setting peer.gossip.pvtData.implicitCollectionDisseminationPolicy.maxPeerCount lower than requiredPeerCount in core.yaml or via env overrides, then calling GlobalConfig / loadPrivDataConfig. Note maxPeerCount of 0 is allowed to disable dissemination only when requiredPeerCount is also 0.
Common situations: Dissemination intentionally disabled by setting maxPeerCount: 0 while forgetting to zero requiredPeerCount; partial override via environment variable; hand-edited core.yaml.
Understand the failure class
Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.
Related errors
- peer.gossip.pvtData.implicitCollectionDisseminationPolicy.re
- unable to load key at '%s'
- unable to load cert at '%s'
- Block data is empty
- Block header is nil
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/358c9678657b9734.
Report an issue: GitHub.