{"record":{"id":"d6b3c8d9fdedee81","repo":"apache/cassandra","slug":"token-changing-ownership-from-to","errorCode":null,"errorMessage":"Token {} changing ownership from {} to {}","messagePattern":"Token (.+?) changing ownership from (.+?) to (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"info","filePath":"src/java/org/apache/cassandra/tcm/listeners/LegacyStateListener.java","lineNumber":245,"sourceCode":"    {\n        for (InetAddressAndPort remove : removed)\n        {\n            GossipHelper.removeAndEvict(remove);\n            PeersTable.removeFromSystemPeersTables(remove);\n        }\n    }\n\n    private void logCompletedReplacement(Directory directory, BootstrapAndReplace sequence)\n    {\n        // legacy log message for compatibility (& tests)\n        InetAddressAndPort replaced = directory.endpoint(sequence.startReplace.replaced());\n        InetAddressAndPort replacement = directory.endpoint(sequence.startReplace.replacement());\n        Collection<Token> tokens = GossipHelper.getTokensFromOperation(sequence);\n        logger.info(\"Node {} will complete replacement of {} for tokens {}\", replacement, replaced, tokens);\n        if (!replacement.equals(replaced))\n        {\n            for (Token token : tokens)\n                logger.warn(\"Token {} changing ownership from {} to {}\", token, replaced, replacement);\n        }\n    }\n\n    private boolean directoryEntryChangedFor(NodeId nodeId, Directory prev, Directory next)\n    {\n        return prev.peerState(nodeId) != next.peerState(nodeId) ||\n               !Objects.equals(prev.getNodeAddresses(nodeId), next.getNodeAddresses(nodeId)) ||\n               !Objects.equals(prev.version(nodeId), next.version(nodeId)) ||\n               !Objects.equals(prev.location(nodeId), next.location(nodeId));\n\n    }\n}\n","sourceCodeStart":227,"sourceCodeEnd":258,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/tcm/listeners/LegacyStateListener.java#L227-L258","documentation":"LegacyStateListener.logCompletedReplacement warns, for each token a replacement sequence moves, that ownership of that token is changing from the replaced node to the replacement node. It is an informational migration log emitted while applying TCM sequences to legacy local/remote state (processChangesToLocalState / processChangesToRemotePeers callers).","triggerScenarios":"A StartReplace/sequence completes via LegacyStateListener.processChanges when a node bootstraps with the 'replace' option: directory.endpoint(sequence.startReplace.replacement()) resolves the replacement, GossipHelper.getTokensFromOperation yields the moved tokens, and each token's ownership change is logged.","commonSituations":"Replacing a dead node with cassandra.replace_address; operator-driven replacement during hardware failover; accidental replacements triggered with wrong replace_address should be checked if token ownership shifts unexpectedly.","solutions":["If intended, no action: this confirms token ranges moved to the replacement node; run repair afterwards.","Verify streaming finished and ranges are consistent (nodetool netsso/repair) after replacement.","If replacement was accidental, check the replace_address config and correct node identity before further bootstraps.","Monitor pending ranges drain so clients stop routing to the replaced node."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"// This is an informational log during replacement; guard the replacement itself\ntry {\n    startReplacement(replaced, replacement);\n} catch (Exception e) {\n    logger.error(\"Replacement initiation failed; tokens not moved\", e);\n}","preventionTips":["Double-check cassandra.replace_address before restart.","Run repair after every replacement to re-sync moved token ranges.","Monitor this log to confirm only intended tokens moved."],"tags":["tcm","token-ownership","replacement","bootstrap"],"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"}