{"record":{"id":"e6d713286218bc4b","repo":"apache/cassandra","slug":"no-move-operation-in-progress-can-t-resume","errorCode":null,"errorMessage":"No move operation in progress, can't resume","messagePattern":"No move operation in progress, can't resume","errorType":"exception","errorClass":"java.lang.IllegalStateException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/tcm/sequences/SingleNodeSequences.java","lineNumber":228,"sourceCode":"\n    static void resumeMove()\n    {\n        if (ClusterMetadataService.instance().isMigrating() || ClusterMetadataService.state() == ClusterMetadataService.State.GOSSIP)\n            throw new IllegalStateException(\"This cluster is migrating to cluster metadata, can't move until that is done.\");\n\n        ClusterMetadata metadata = ClusterMetadata.current();\n        NodeId self = metadata.myNodeId();\n        MultiStepOperation<?> sequence = metadata.inProgressSequences.get(self);\n        if (sequence == null || sequence.kind() != MultiStepOperation.Kind.MOVE)\n        {\n            String msg = \"No move operation in progress, can't resume\";\n            logger.info(msg);\n            if (StorageService.instance.operationMode() == MOVE_FAILED)\n            {\n                // there is no ongoing move to resume, but operation mode thinks there is\n                StorageService.instance.clearTransientMode();\n            }\n            throw new IllegalStateException(msg);\n        }\n        if (StorageService.instance.operationMode() != MOVE_FAILED)\n        {\n            String msg = \"Can't resume a move operation unless it has failed\";\n            logger.info(msg);\n            throw new IllegalStateException(msg);\n        }\n        StorageService.instance.clearTransientMode();\n        InProgressSequences.finishInProgressSequences(self);\n    }\n\n    static void abortMove(String nodeId)\n    {\n        abortHelper(nodeId, MultiStepOperation.Kind.MOVE, MOVE_FAILED);\n    }\n\n    /**\n     *","sourceCodeStart":210,"sourceCodeEnd":246,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/tcm/sequences/SingleNodeSequences.java#L210-L246","documentation":"resumeMove requires an in-progress MOVE sequence in ClusterMetadata. If metadata.inProgressSequences has no MOVE for the local node, it throws IllegalStateException 'No move operation in progress, can't resume' - and as a courtesy clears a stale MOVE_FAILED StorageService mode if one is set.","triggerScenarios":"Running `nodetool resumemove` when there is no MOVE multi-step operation registered for this node: the move fully completed, was already aborted, or never started on this node.","commonSituations":"Calling resumemove by mistake on a node where the move succeeded (finishInProgressSequences already ran); resuming after an abort; running the command on the wrong host.","solutions":["Confirm with `nodetool ring` whether the move actually completed - if so, no resume is needed.","Check `nodetool inprogresssequences` for a MOVE entry for this node before resuming.","If StorageService mode was MOVE_FAILED but nothing is in progress, the command already cleared the transient mode; re-run move instead.","Retry the move from scratch if the original one was aborted."],"exampleFix":"// before\nnodetool resumemove   // IllegalStateException: no move in progress\n// after\nnodetool ring          # verify tokens already moved\nnodetool move <token>  # start a new move if needed","handlingStrategy":"validation","validationCode":"MultiStepOperation<?> seq = ClusterMetadata.current().inProgressSequences.get(self);\nif (seq == null || seq.kind() != MultiStepOperation.Kind.MOVE)\n    return; // nothing to resume","typeGuard":"boolean hasMoveInProgress(NodeId self) { MultiStepOperation<?> s = ClusterMetadata.current().inProgressSequences.get(self); return s != null && s.kind() == MultiStepOperation.Kind.MOVE; }","tryCatchPattern":"try { resumeMove(); }\ncatch (IllegalStateException e) { if (e.getMessage().contains(\"No move operation in progress\")) { verifyMoveCompletedOrRestart(); } else throw e; }","preventionTips":["Check inprogresssequences before resuming","Distinguish completed vs failed moves from logs","Run resume commands on the correct host"],"tags":["cassandra","move","resume","no-op"],"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"}