hyperledger/fabric · error

next config is missing orderer group

Error message

next config is missing orderer group

What it means

MaintenanceFilter.inspect returns this when the proposed next config bundle has no Orderer group (bundle.OrdererConfig() returns ok=false). A config update that removes or fails to define the orderer group cannot be evaluated for consensus-type migration rules and is rejected.

Source

Thrown at orderer/common/msgprocessor/maintenancefilter.go:91

	return nil
}

// inspect checks whether the next orderer config, extracted from the incoming configEnvelope, respects the
// transition rules of consensus-type migration using maintenance-mode.
func (mf *MaintenanceFilter) inspect(configEnvelope *cb.ConfigEnvelope, ordererConfig channelconfig.Orderer) error {
	if configEnvelope.LastUpdate == nil {
		return errors.Errorf("updated config does not include a config update")
	}

	bundle, err := channelconfig.NewBundle(mf.support.ChannelID(), configEnvelope.Config, mf.bccsp)
	if err != nil {
		return errors.Wrap(err, "failed to parse config")
	}

	nextOrdererConfig, ok := bundle.OrdererConfig()
	if !ok {
		return errors.New("next config is missing orderer group")
	}

	if !ordererConfig.Capabilities().ConsensusTypeMigration() {
		if nextState := nextOrdererConfig.ConsensusState(); nextState != orderer.ConsensusType_STATE_NORMAL {
			return errors.Errorf("next config attempted to change ConsensusType.State to %s, but capability is disabled", nextState)
		}
		if ordererConfig.ConsensusType() != nextOrdererConfig.ConsensusType() {
			return errors.Errorf("next config attempted to change ConsensusType.Type from %s to %s, but capability is disabled",
				ordererConfig.ConsensusType(), nextOrdererConfig.ConsensusType())
		}
		return nil
	}

	// Entry to- and exit from- maintenance-mode should not be accompanied by any other change.
	if ordererConfig.ConsensusState() != nextOrdererConfig.ConsensusState() {
		if err1Change := mf.ensureConsensusTypeChangeOnly(configEnvelope); err1Change != nil {
			return err1Change
		}

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Ensure the next Config includes a complete Channel/Orderer group with its values and policies
  2. Base the update on the current channel config so the orderer group is preserved (use configtxlator fetch/latest config as the starting point)
  3. Check the update's write-set doesn't remove the Orderer group
Defensive patterns

Strategy: validation

Validate before calling

b, err := channelconfig.NewBundle(chID, nextConfig, bccsp)
if err != nil { return err }
if _, ok := b.OrdererConfig(); !ok { return errors.New("next config missing Orderer group") }

Prevention

When it happens

Trigger: Submitting a config update whose resulting Config lacks the Orderer group — e.g. an update that deletes the orderer group or a partial config that omits it.

Common situations: Hand-built config envelopes missing the Orderer group; a config update intended only for another group but serialized without the base orderer config; corruption from editing decoded config with configtxlator.

Related errors


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