{"record":{"id":"b8bee3d62cd51faa","repo":"apache/cassandra","slug":"could-not-reconfigure-cms-operator-should-run-no","errorCode":null,"errorMessage":"Could not reconfigure CMS, operator should run `nodetool cms reconfigure` to make sure CMS placement is correct","messagePattern":"Could not reconfigure CMS, operator should run `nodetool cms reconfigure` to make sure CMS placement is correct","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"src/java/org/apache/cassandra/tcm/ClusterMetadataService.java","lineNumber":531,"sourceCode":"    }\n\n    public void ensureCMSPlacement(ClusterMetadata metadata)\n    {\n        if (TCM_SKIP_CMS_RECONFIGURATION_AFTER_TOPOLOGY_CHANGE.getBoolean())\n        {\n            logger.info(\"Not performing CMS reconfiguration as {} property is set. This should only be used for testing.\",\n                        TCM_SKIP_CMS_RECONFIGURATION_AFTER_TOPOLOGY_CHANGE.getKey());\n            return;\n        }\n\n        try\n        {\n            reconfigureCMS(ReplicationParams.meta(metadata));\n        }\n        catch (Throwable t)\n        {\n            JVMStabilityInspector.inspectThrowable(t);\n            logger.warn(\"Could not reconfigure CMS, operator should run `nodetool cms reconfigure` to make sure CMS placement is correct\", t);\n        }\n    }\n\n    public boolean applyFromGossip(ClusterMetadata expected, ClusterMetadata updated)\n    {\n        logger.debug(\"Applying from gossip, current={} new={}\", expected, updated);\n        if (!expected.epoch.isBefore(Epoch.EMPTY))\n            throw new IllegalStateException(\"Can't apply a ClusterMetadata from gossip with epoch \" + expected.epoch);\n        if (state() != GOSSIP)\n            throw new IllegalStateException(\"Can't apply a ClusterMetadata from gossip when CMSState is not GOSSIP: \" + state());\n\n        return log.unsafeSetCommittedFromGossip(expected, updated);\n    }\n\n    public void setFromGossip(ClusterMetadata fromGossip)\n    {\n        logger.debug(\"Setting from gossip, new={}\", fromGossip);\n        if (state() != GOSSIP)","sourceCodeStart":513,"sourceCodeEnd":549,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/tcm/ClusterMetadataService.java#L513-L549","documentation":"ClusterMetadataService.ensureCMSPlacement catches a failure while trying to automatically reconfigure the CMS replication and logs this warning instead of failing. It tells the operator that automatic CMS placement repair did not succeed and manual reconfiguration via `nodetool cms reconfigure` is needed.","triggerScenarios":"A node starts (or topology changes) and ensureCMSPlacement attempts reconfigureCMS(ReplicationParams.meta(metadata)) but the commit fails — e.g. not enough nodes to satisfy placement, unreachable CMS members, or a Paxos/commit timeout.","commonSituations":"Bootstrapping a cluster too small for the requested CMS replication factor; nodes down or unreachable during startup; multi-DC setups where the CMS placement cannot be satisfied.","solutions":["Run `nodetool cms reconfigure <rf>` manually once the cluster is healthy.","Check cluster size and node availability against the required CMS replication factor.","Inspect the logged cause (the attached Throwable) for the underlying commit failure.","Fix network/partition issues, then retry startup or run reconfigure again."],"exampleFix":"// before\nbin/nodetool status  # confirm nodes up\n// after\nbin/nodetool cms reconfigure --replication-factor 3","handlingStrategy":"fallback","validationCode":"// check cluster size vs required CMS RF before relying on auto-placement\nif (liveNodes.size() < requiredCmsRf) logger.warn(\"too few live nodes for CMS placement\");","typeGuard":null,"tryCatchPattern":"try { ensureCMSPlacement(); } catch (Throwable t) { runNodetoolCmsReconfigure(); }","preventionTips":["Start clusters with enough nodes for the CMS replication factor","Keep CMS members healthy and quorum-reachable","Watch startup logs for this warning and reconfigure manually"],"tags":["cms","topology","operator-action"],"backgroundTag":"api-error-response","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}