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
- Ensure the next Config includes a complete Channel/Orderer group with its values and policies
- Base the update on the current channel config so the orderer group is preserved (use configtxlator fetch/latest config as the starting point)
- 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
- Start every update from the full current channel config
- Never delete or omit the Orderer group in a write set
- Diff updates with configtxlator to confirm only intended groups change
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
- config transaction inspection failed
- failed to parse config
- attempted to change ConsensusType.Type from %s to %s, but Co
- attempted to change ConsensusType.Metadata, but ConsensusTyp
- error computing config update
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/eb80a32b0fd24b79.
Report an issue: GitHub.