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

  1. Raise maxPeerCount so it is >= requiredPeerCount
  2. If intentionally disabling dissemination, set both maxPeerCount and requiredPeerCount to 0
  3. 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

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


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