{"record":{"id":"88d7c9eef0fbb4c3","repo":"apache/cassandra","slug":"maps-differ","errorCode":null,"errorMessage":"Maps differ: {} != {}","messagePattern":"Maps differ: (.+?) != (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"src/java/org/apache/cassandra/tcm/ownership/DataPlacements.java","lineNumber":306,"sourceCode":"                size += DataPlacement.serializerFor(entry.getKey()).serializedSize(entry.getValue(), version);\n            }\n            size += Epoch.serializer.serializedSize(t.lastModified, version);\n            return size;\n        }\n    }\n\n    public static ImmutableMap<ReplicationParams, DataPlacement> capLastModified(Epoch lastModified, Map<ReplicationParams, DataPlacement> placements)\n    {\n        ImmutableMap.Builder<ReplicationParams, DataPlacement> builder = ImmutableMap.builder();\n        placements.forEach((params, placement) -> builder.put(params, placement.withCappedLastModified(lastModified)));\n        return builder.build();\n    }\n\n    public void dumpDiff(DataPlacements other)\n    {\n        if (!map.equals(other.map))\n        {\n            logger.warn(\"Maps differ: {} != {}\", map, other.map);\n            dumpDiff(logger,map, other.map);\n        }\n    }\n\n    private static final Logger logger = LoggerFactory.getLogger(DataPlacements.class);\n    public static void dumpDiff(Logger logger, Map<ReplicationParams, DataPlacement> l, Map<ReplicationParams, DataPlacement> r)\n    {\n        for (ReplicationParams k : Sets.intersection(l.keySet(), r.keySet()))\n        {\n            DataPlacement lv = l.get(k);\n            DataPlacement rv = r.get(k);\n            if (!Objects.equals(lv, rv))\n            {\n                logger.warn(\"Values for key {} differ: {} != {}\", k, lv, rv);\n                logger.warn(\"Difference: {}\", lv.difference(ClusterMetadata.current().directory, rv));\n            }\n        }\n        for (ReplicationParams k : Sets.difference(l.keySet(), r.keySet()))","sourceCodeStart":288,"sourceCodeEnd":324,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/tcm/ownership/DataPlacements.java#L288-L324","documentation":"Warning from DataPlacements.dumpDiff, a diagnostic helper that runs when two DataPlacements objects (replication placement per keyspace replication params) are not equal. It logs the full maps that differ and then delegates to a per-entry diff. Like the Directory dumpDiff warnings, it is logging-only, used to explain why a placement verification (e.g. during CMS initialization) failed.","triggerScenarios":"DataPlacements.dumpDiff(other) is called after map.equals(other.map) fails — typically from a CMS initialization/migration verification path when the initiator's data placements differ from the local node's.","commonSituations":"A keyspace's replication settings (e.g. NetworkTopologyStrategy RF) were changed on some nodes but placement calculations diverged; pending replication changes were applied on the initiator but not the peer; nodes at different Cassandra versions computing placements differently.","solutions":["Read the logged map diff to see which replication params/placements differ, then let CMS replicate the latest placement transforms so both nodes converge","Check for interrupted ALTER TABLE / replication-factor changes and re-run them so placements are recalculated consistently","Ensure both nodes run the same version before the migration so placement computation is identical"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"if (!expectedPlacements.equals(ClusterMetadata.current().placements)) {\n    expectedPlacements.dumpDiff(ClusterMetadata.current().placements);\n    // resync placements before continuing\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Complete any pending replication-factor changes before comparing or migrating placements","Run mixed-version clusters only outside migration windows","Monitor for placement diff warnings after ALTER TABLE replication changes"],"tags":["logging","replication","placement","diagnostics"],"backgroundTag":"schema-validation-failed","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"}