{"record":{"id":"fad2713d95ffe524","repo":"apache/cassandra","slug":"is-not-a-cms-member","errorCode":null,"errorMessage":" is not a CMS member","messagePattern":" is not a CMS member","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/tcm/CMSMembership.java","lineNumber":172,"sourceCode":"        return new CMSMembership(lastModified, fullMembers, joiningMembers.without(id));\n    }\n\n    public CMSMembership finishJoining(NodeId id)\n    {\n        if (!joiningMembers.contains(id))\n            throw new IllegalStateException(id + \" is not currently joining the CMS\");\n        if (fullMembers.contains(id))\n            throw new IllegalStateException(id + \" has already fully joined the CMS\");\n\n        return new CMSMembership(lastModified, fullMembers.with(id), joiningMembers.without(id));\n    }\n\n    public CMSMembership leave(NodeId id)\n    {\n        if (joiningMembers.contains(id))\n            throw new IllegalStateException(id + \" is currently joining the CMS, \");\n        if (!fullMembers.contains(id))\n            throw new IllegalStateException(id + \" is not a CMS member\");\n\n        return new CMSMembership(lastModified, fullMembers.without(id), joiningMembers);\n    }\n\n    @Override\n    public String toString()\n    {\n        return \"CMSMembership{\" +\n               \"lastModified=\" + lastModified +\n               \", fullMembers=\" + fullMembers +\n               \", joiningMembers=\" + joiningMembers +\n               '}';\n    }\n\n    @Override\n    public final boolean equals(Object o)\n    {\n        if (!(o instanceof CMSMembership)) return false;","sourceCodeStart":154,"sourceCodeEnd":190,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/tcm/CMSMembership.java#L154-L190","documentation":"IllegalStateException from CMSMembership.leave: the node id is neither a joining member nor (in the failing branch) a removable full member, so it 'is not a CMS member'. leave() can only be applied to nodes registered in the CMS membership metadata; requesting leave for an unknown/already-removed node is rejected.","triggerScenarios":"Calling leave(NodeId) for a node id not contained in fullMembers (already left, never joined, or unknown id).","commonSituations":"Decommissioning a node that already left the CMS, using a stale NodeId after a re-bootstrap, or typo/mismatch of node ids in operator tooling.","solutions":["Verify the node is a full CMS member before committing Leave.","If the node already left, skip the operation (it is a no-op).","Confirm the NodeId is current; re-query ClusterMetadata.directory for the right id."],"exampleFix":"// before\ncms.commit(new Leave(nodeId));\n// after\nif (ClusterMetadata.current().fullMembers.contains(nodeId)) cms.commit(new Leave(nodeId));","handlingStrategy":"validation","validationCode":"if (!ClusterMetadata.current().fullMembers.contains(nodeId)) throw new IllegalStateException(nodeId + \" is not a CMS member; nothing to leave\");","typeGuard":null,"tryCatchPattern":"try { cms.commit(new Leave(id)); } catch (IllegalStateException e) { if (e.getMessage().contains(\"not a CMS member\")) return; throw e; }","preventionTips":["Verify full membership before leave","Refresh NodeId lookups from current directory","Make leave idempotent for already-left nodes"],"tags":["tcm","cms-membership","invalid-state-transition"],"backgroundTag":"invalid-state-transition","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"}