{"record":{"id":"eb80a32b0fd24b79","repo":"hyperledger/fabric","slug":"next-config-is-missing-orderer-group","errorCode":null,"errorMessage":"next config is missing orderer group","messagePattern":"next config is missing orderer group","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"orderer/common/msgprocessor/maintenancefilter.go","lineNumber":91,"sourceCode":"\n\treturn nil\n}\n\n// inspect checks whether the next orderer config, extracted from the incoming configEnvelope, respects the\n// transition rules of consensus-type migration using maintenance-mode.\nfunc (mf *MaintenanceFilter) inspect(configEnvelope *cb.ConfigEnvelope, ordererConfig channelconfig.Orderer) error {\n\tif configEnvelope.LastUpdate == nil {\n\t\treturn errors.Errorf(\"updated config does not include a config update\")\n\t}\n\n\tbundle, err := channelconfig.NewBundle(mf.support.ChannelID(), configEnvelope.Config, mf.bccsp)\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"failed to parse config\")\n\t}\n\n\tnextOrdererConfig, ok := bundle.OrdererConfig()\n\tif !ok {\n\t\treturn errors.New(\"next config is missing orderer group\")\n\t}\n\n\tif !ordererConfig.Capabilities().ConsensusTypeMigration() {\n\t\tif nextState := nextOrdererConfig.ConsensusState(); nextState != orderer.ConsensusType_STATE_NORMAL {\n\t\t\treturn errors.Errorf(\"next config attempted to change ConsensusType.State to %s, but capability is disabled\", nextState)\n\t\t}\n\t\tif ordererConfig.ConsensusType() != nextOrdererConfig.ConsensusType() {\n\t\t\treturn errors.Errorf(\"next config attempted to change ConsensusType.Type from %s to %s, but capability is disabled\",\n\t\t\t\tordererConfig.ConsensusType(), nextOrdererConfig.ConsensusType())\n\t\t}\n\t\treturn nil\n\t}\n\n\t// Entry to- and exit from- maintenance-mode should not be accompanied by any other change.\n\tif ordererConfig.ConsensusState() != nextOrdererConfig.ConsensusState() {\n\t\tif err1Change := mf.ensureConsensusTypeChangeOnly(configEnvelope); err1Change != nil {\n\t\t\treturn err1Change\n\t\t}","sourceCodeStart":73,"sourceCodeEnd":109,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/orderer/common/msgprocessor/maintenancefilter.go#L73-L109","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"b, err := channelconfig.NewBundle(chID, nextConfig, bccsp)\nif err != nil { return err }\nif _, ok := b.OrdererConfig(); !ok { return errors.New(\"next config missing Orderer group\") }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["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"],"tags":["ordering","channelconfig","orderer-group","config-update"],"backgroundTag":"missing-orderer-config-group","analyzedSha":"2736b63f8fd5932511d56fe68b7039d15977f7f6","analyzedAt":"2026-09-04T08:52:36.465Z","contentChangedAt":"2026-09-04T08:52:36.465Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}