{"record":{"id":"6df88b62ee785b4f","repo":"apache/cassandra","slug":"unable-to-identify-a-quorum-of-cms-members-found","errorCode":null,"errorMessage":"Unable to identify a quorum of CMS members (found %s, required %s). If attemping rediscovery after multiple endpoint changes, check thatseeds have been correctly updated.","messagePattern":"Unable to identify a quorum of CMS members \\(found (.+?), required (.+?)\\)\\. If attemping rediscovery after multiple endpoint changes, check thatseeds have been correctly updated\\.","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"critical","filePath":"src/java/org/apache/cassandra/tcm/Startup.java","lineNumber":393,"sourceCode":"                if (!builder.hasOverrides())\n                {\n                    logger.info(\"No overrides required for CMS members\");\n                    return replayed;\n                }\n\n                if (replayed.initCMSLookup(builder.build()))\n                {\n                    logger.info(\"Adding CMS lookup log listener\");\n                    ClusterMetadataService.instance().log().addListener(new CMSLookup.LogListener());\n                    return replayed;\n                }\n                else\n                    throw new RuntimeException(\"Could not initialize CMS lookup\");\n            }\n        }\n        else\n        {\n            throw new RuntimeException(String.format(\"Unable to identify a quorum of CMS members (found %s, required %s). \" +\n                                                     \"If attemping rediscovery after multiple endpoint changes, check that\" +\n                                                     \"seeds have been correctly updated.\",\n                                                     confirmedCMS.size(), quorum));\n        }\n    }\n\n    public static void scrubDataDirectories(ClusterMetadata metadata) throws StartupException\n    {\n        // clean up debris in the rest of the keyspaces\n        for (KeyspaceMetadata keyspace : metadata.schema.getKeyspaces())\n        {\n            // Skip system as we've already cleaned it\n            if (keyspace.name.equals(SchemaConstants.SYSTEM_KEYSPACE_NAME) || keyspace.name.equals(SchemaConstants.ACCORD_KEYSPACE_NAME))\n                continue;\n\n            for (TableMetadata cfm : keyspace.tables)\n            {\n                ColumnFamilyStore.scrubDataDirectories(cfm);","sourceCodeStart":375,"sourceCodeEnd":411,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/tcm/Startup.java#L375-L411","documentation":"Startup.initializeCMSLookup counts how many CMS candidate endpoints were confirmed (confirmedCMS) and compares against the required quorum. If fewer than quorum endpoints could be confirmed, it throws 'Unable to identify a quorum of CMS members'. The included hint targets rediscovery after multiple endpoint changes: if seeds were not updated to include current CMS members, discovery cannot confirm enough members to proceed.","triggerScenarios":"initializeCMSLookup confirmed fewer confirmedCMS.size() members than quorum; seeds/endpoint list excludes actual CMS members after topology changes; CMS members are down or unreachable so confirmation fails.","commonSituations":"Cluster whose CMS moved but cassandra.yaml seeds still list retired nodes; multiple endpoint changes during migration leaving stale seeds; partial outage of CMS members so quorum cannot be met; rediscovery after a rolling replacement.","solutions":["Update the seed list (cassandra.yaml / cassandra-rackdc config) to include the current CMS members, then restart.","Verify which nodes are the live CMS members (from any healthy node: nodetool cms show) and ensure they are up and reachable.","Bring enough CMS members online to meet quorum (quorum = majority of CMS members).","If the CMS membership is definitively lost, follow the documented CMS recovery/replacement procedure before restarting this node."],"exampleFix":"// before: seeds point at retired nodes after endpoint changes\nseeds:\n  - 10.0.0.1:7000  # decommissioned\n// after: seeds include current CMS members\nseeds:\n  - 10.0.0.11:7000  # current CMS member\n  - 10.0.0.12:7000  # current CMS member","handlingStrategy":"validation","validationCode":"// pre-flight: confirm enough configured endpoints are current CMS members\nint confirmed = seeds.stream().filter(CMS::isKnownCmsMember).count();\nif (confirmed < quorumSize) throw new ConfigurationException(\"Update seeds to include current CMS members\");","typeGuard":null,"tryCatchPattern":"try { Startup.initializeCMSLookup(...); }\ncatch (RuntimeException e) {\n    if (e.getMessage().startsWith(\"Unable to identify a quorum of CMS members\")) {\n        // refresh seeds to current CMS members and restart\n    } else throw e;\n}","preventionTips":["Update the seed list whenever CMS membership changes","Run a majority of CMS members across failure domains","Automate seed-list refresh after CMS migrations","Verify seeds resolve and are reachable before restart"],"tags":["tcm","cms","quorum","discovery","seeds"],"backgroundTag":"connection-refused","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}