{"record":{"id":"5876793e2db7c0db","repo":"apache/cassandra","slug":"can-t-abort-a-s-operation-for-a-node-s-s-that","errorCode":null,"errorMessage":"Can't abort a %s operation for a node %s (%s) that is UP - run abortdecommission on that instance","messagePattern":"Can't abort a (.+?) operation for a node (.+?) \\((.+?)\\) that is UP - run abortdecommission on that instance","errorType":"exception","errorClass":"java.lang.IllegalStateException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/tcm/sequences/SingleNodeSequences.java","lineNumber":290,"sourceCode":"                throw new IllegalStateException(msg);\n            }\n        }\n        if (toAbort.equals(metadata.myNodeId()))\n        {\n            if (ssMode != null && StorageService.instance.operationMode() != ssMode)\n            {\n                String msg = String.format(\"Can't abort a %s operation unless it has failed\", kind);\n                logger.info(msg);\n                throw new IllegalStateException(msg);\n            }\n            StorageService.instance.clearTransientMode();\n        }\n        else if (Gossiper.instance.isAlive(metadata.directory.endpoint(toAbort)))\n        {\n            String msg = String.format(\"Can't abort a %s operation for a node %s (%s) that is UP - run abortdecommission on that instance\",\n                                       kind, toAbort, metadata.directory.endpoint(toAbort));\n            logger.info(msg);\n            throw new IllegalStateException(msg);\n        }\n        ClusterMetadataService.instance().commit(new CancelInProgressSequence(toAbort));\n    }\n}\n","sourceCodeStart":272,"sourceCodeEnd":295,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/tcm/sequences/SingleNodeSequences.java#L272-L295","documentation":"When aborting a decommission/remove/move for a REMOTE node, abortHelper refuses if Gossiper reports that node as UP. The failure must be confirmed (node down) before CancelInProgressSequence is committed; otherwise the operator is told to run abortdecommission on that live instance itself. This prevents cancelling a sequence on a node that may actually be progressing.","triggerScenarios":"abortRemoveNode/abortDecommission targeting a node that Gossiper still marks alive; network partition healed and the node rejoined before the abort was issued.","commonSituations":"Operator aborts a remove after the 'failed' node came back online; DNS/IP restored so gossip marks the endpoint UP; abort run from the wrong coordinator.","solutions":["Run the abort command on the UP node itself as the message instructs (abortdecommission on that instance)","Verify the node is really down (nodetool gossipinfo / ping) before aborting remotely","If the node is truly gone, wait for gossip to mark it dead (or force its removal via the appropriate removal path) then retry"],"exampleFix":"// before\n// on coordinator: nodetool abortremove <nodeId>   // node still UP\n// after\n// ssh to the target node and run there:\nnodetool abortdecommission","handlingStrategy":"validation","validationCode":"// abort remotely only if Gossiper marks the target down\nif (Gossiper.instance.isAlive(endpoint))\n    throw new IllegalStateException(\"Target node is UP - run abortdecommission on that instance\");","typeGuard":null,"tryCatchPattern":"try { abortRemote(nodeId); }\ncatch (IllegalStateException e) {\n    if (e.getMessage().contains(\"that is UP\")) { /* run the abort on the target node itself */ }\n    else throw e;\n}","preventionTips":["Confirm the target node is down (gossip status) before remote abort","Prefer running abortdecommission on the failed node itself when it is reachable","Watch for nodes rejoining after a partition heals; re-check status right before abort"],"tags":["cluster-operations","gossip","tcm"],"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-14T16:17:12.679Z"}