{"record":{"id":"2add22c1c9916d98","repo":"apache/cassandra","slug":"cms-membership-differ","errorCode":null,"errorMessage":"CMS Membership differ: {} != {}","messagePattern":"CMS Membership differ: (.+?) != (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"src/java/org/apache/cassandra/tcm/ClusterMetadata.java","lineNumber":1275,"sourceCode":"        {\n            logger.warn(\"Placements differ:\");\n            placements.dumpDiff(other.placements);\n        }\n        if (!lockedRanges.equals(other.lockedRanges))\n        {\n            logger.warn(\"Locked ranges differ: {} != {}\", lockedRanges, other.lockedRanges);\n        }\n        if (!inProgressSequences.equals(other.inProgressSequences))\n        {\n            logger.warn(\"In progress sequences differ: {} != {}\", inProgressSequences, other.inProgressSequences);\n        }\n        if (!extensions.equals(other.extensions))\n        {\n            logger.warn(\"Extensions differ: {} != {}\", extensions, other.extensions);\n        }\n        if (!cmsMembership.equals(other.cmsMembership))\n        {\n            logger.warn(\"CMS Membership differ: {} != {}\", cmsMembership, other.cmsMembership);\n        }\n    }\n\n    @Override\n    public int hashCode()\n    {\n        return Objects.hash(epoch, schema, directory, tokenMap, placements, accordFastPath, lockedRanges, inProgressSequences, consensusMigrationState, accordStaleReplicas, extensions, cmsMembership);\n    }\n\n    public static ClusterMetadata current()\n    {\n        return ClusterMetadataService.instance().metadata();\n    }\n\n    public static void checkIdentifier(int remoteIdentifier)\n    {\n        ClusterMetadata metadata = currentNullable();\n        if (metadata != null)","sourceCodeStart":1257,"sourceCodeEnd":1293,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/tcm/ClusterMetadata.java#L1257-L1293","documentation":"ClusterMetadata logs a warning when the cmsMembership set (the nodes currently forming the Cluster Metadata Service) differs between two ClusterMetadata instances. This is part of the metadata diff diagnostics helper used to spot membership disagreement between replicas.","triggerScenarios":"Comparing ClusterMetadata instances where the CMS membership sets differ, e.g. after a join/leave/decommission that was applied on one node but not another.","commonSituations":"Concurrent node joins/leaves; a node that missed membership transformation entries; debugging why quorum operations fail or why gossip-applied metadata is rejected.","solutions":["Ensure the node fetches the latest log from CMS so its membership view catches up (`nodetool cms show` to inspect).","Wait for any in-progress join/leave transformation to commit on all replicas.","Run `nodetool cms reconfigure` if CMS placement/membership is genuinely wrong.","Restart the lagging node to force metadata re-initialization from the CMS if it remains stale."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"if (!local.cmsMembership().equals(remote.cmsMembership())) logger.warn(\"CMS membership stale; fetch log from CMS before proceeding\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Catch nodes up to the latest epoch before membership-sensitive operations","Avoid simultaneous joins/leaves","Run nodetool cms reconfigure after membership mistakes"],"tags":["cluster-metadata","cms-membership","diagnostics"],"backgroundTag":"internal-invariant-violation","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"}