{"record":{"id":"d6c789e14f8ac9bc","repo":"apache/cassandra","slug":"locked-ranges-differ","errorCode":null,"errorMessage":"Locked ranges differ: {} != {}","messagePattern":"Locked ranges differ: (.+?) != (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"src/java/org/apache/cassandra/tcm/ClusterMetadata.java","lineNumber":1263,"sourceCode":"        }\n        if (!directory.equals(other.directory))\n        {\n            logger.warn(\"Directories differ:\");\n            directory.dumpDiff(other.directory);\n        }\n        if (!tokenMap.equals(other.tokenMap))\n        {\n            logger.warn(\"Token maps differ:\");\n            tokenMap.dumpDiff(other.tokenMap);\n        }\n        if (!placements.equals(other.placements))\n        {\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    {","sourceCodeStart":1245,"sourceCodeEnd":1281,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/tcm/ClusterMetadata.java#L1245-L1281","documentation":"ClusterMetadata's equivalence/diff check compares this metadata against another snapshot. When lockedRanges differs, it logs 'Locked ranges differ: {} != {}' as a warning (not thrown). This diagnostic runs when validating/reconciling two ClusterMetadata views (e.g. loading from log vs. computed state) and indicates the locked-ranges component diverged between them.","triggerScenarios":"Replaying the TCM commit log or comparing an in-memory ClusterMetadata against a serialized/recomputed copy where lockedRanges (range locks held by operations like repairs) do not match.","commonSituations":"Concurrent range-locking operations (repairs/maintenance) during snapshot/replay; a bug in diffing or serialization; partial log replay after crash.","solutions":["Re-run the comparison after quiescing range-locking operations (finish active repairs) to see if the difference is transient","Restart/realign the node's TCM state (force refresh from the current epoch)","Check preceding 'Placements differ' / other diff warnings to characterize the divergence; report to the project if reproducible (likely a TCM bug)","Verify all CMS members are on the same epoch and no node has a stale log"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// before diffing metadata, ensure no in-flight range operations\nif (ClusterMetadata.current().lockedRanges.size() > 0)\n    logger.warn(\"Active range locks may cause diff mismatch; quiesce repairs first\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Quiesce repairs/range operations before snapshotting or diffing TCM state","Keep all CMS members on the same epoch","Treat repeated diff warnings as a TCM bug and report with repro"],"tags":["tcm","cluster-metadata","diff","locked-ranges"],"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-17T15:17:12.973Z"}