{"record":{"id":"7aa622c00148a84e","repo":"apache/cassandra","slug":"versions-differ","errorCode":null,"errorMessage":"Versions differ: {} != {}","messagePattern":"Versions differ: (.+?) != (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"src/java/org/apache/cassandra/tcm/membership/Directory.java","lineNumber":930,"sourceCode":"            logger.warn(\"Locations differ: {} != {}\", locations, other.locations);\n        }\n        if (!Objects.equals(states, other.states))\n        {\n            logger.warn(\"States differ: {} != {}\", states, other.states);\n            dumpDiff(logger, states, other.states);\n        }\n        if (!Objects.equals(endpointsByDC, other.endpointsByDC))\n        {\n            logger.warn(\"Endpoints by dc differ: {} != {}\", endpointsByDC, other.endpointsByDC);\n            dumpDiff(logger, endpointsByDC.asMap(), other.endpointsByDC.asMap());\n        }\n        if (!Objects.equals(racksByDC, other.racksByDC))\n        {\n            logger.warn(\"Racks by dc differ: {} != {}\", racksByDC, other.racksByDC);\n        }\n        if (!Objects.equals(versions, other.versions))\n        {\n            logger.warn(\"Versions differ: {} != {}\", versions, other.versions);\n            dumpDiff(logger, versions, other.versions);\n        }\n        if (!Objects.equals(addresses, other.addresses))\n        {\n            logger.warn(\"Addresses differ: {} != {}\", addresses, other.addresses);\n            dumpDiff(logger, addresses, other.addresses);\n        }\n    }\n\n    public static <K, V> void dumpDiff(Logger logger, Map<K, V> l, Map<K, V> r)\n    {\n        for (K k : Sets.intersection(l.keySet(), r.keySet()))\n        {\n            V lv = l.get(k);\n            V rv = r.get(k);\n            if (!Objects.equals(lv, rv))\n                logger.warn(\"Values for key {} differ: {} != {}\", k, lv, rv);\n        }","sourceCodeStart":912,"sourceCodeEnd":948,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/tcm/membership/Directory.java#L912-L948","documentation":"WARN log from Directory.dumpDiff(Directory) indicating the versions maps (NodeId to per-node release/feature version) differ between two Directory snapshots. Divergent node versions mean the cluster disagrees on each member's Cassandra version, which gates feature flags and upgrade checks. Diagnostic only; the static dumpDiff also logs per-key value differences.","triggerScenarios":"dumpDiff(other) when Objects.equals(versions, other.versions) is false; typically a node upgraded (or its version re-registered via setVersion) in one view while the other view still records the old version.","commonSituations":"Rolling upgrade in progress with stale metadata on some nodes; a node rejoined with a different binary version; snapshots compared before and after an upgrade transformation was committed.","solutions":["Complete the rolling upgrade on all nodes so versions converge in cluster metadata","Replay missed cluster metadata events on the node holding the outdated versions map","Ensure nodes register their version via the proper TCM transformation rather than local-only state","Re-diff only snapshots captured at the same epoch"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// Verify upgrade is complete cluster-wide before diffing version maps\nboolean upgradeDone = dir.versions().values().stream()\n    .allMatch(v -> v.equals(targetVersion));\nif (upgradeDone) dir.dumpDiff(other);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Finish rolling upgrades on all nodes before making version-dependent assertions","Ensure node versions are registered via cluster metadata, not local-only state","Replay metadata on nodes holding outdated version entries","Snapshot directories at a single epoch for comparisons"],"tags":["cassandra","tcm","upgrade","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"}