{"record":{"id":"5ac5b578eadb4ab5","repo":"apache/cassandra","slug":"unable-to-move","errorCode":null,"errorMessage":"Unable to move","messagePattern":"Unable to move","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/tcm/sequences/Move.java","lineNumber":375,"sourceCode":"                                throw new IllegalStateException(\"Node should be either source or destination in the movement map \" + endpoints);\n                        }\n                    }\n\n                    StreamResultFuture streamResult = streamPlan.execute();\n\n                    Future<?> accordReady = AccordService.instance().epochReadyFor(metadata, EpochReady::reads);\n                    Future<?> ready = FutureCombiner.allOf(streamResult, accordReady);\n                    ready.get();\n                    StorageService.instance.repairPaxosForTopologyChange(\"move\");\n                }\n                catch (InterruptedException e)\n                {\n                    return continuable();\n                }\n                catch (ExecutionException e)\n                {\n                    StorageService.instance.markMoveFailed();\n                    throw new RuntimeException(\"Unable to move\", e);\n                }\n                catch (Exception e)\n                {\n                    StorageService.instance.markMoveFailed();\n                    throw e;\n                }\n\n                try\n                {\n                    ClusterMetadataService.instance().commit(midMove);\n                }\n                catch (Throwable t)\n                {\n                    logger.warn(\"Exception committing midMove, will retry on next TCM epoch advance\", t);\n                    JVMStabilityInspector.inspectThrowable(t);\n                    return continuable();\n                }\n                break;","sourceCodeStart":357,"sourceCodeEnd":393,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/tcm/sequences/Move.java#L357-L393","documentation":"executeNext wraps the move's streaming/metadata step; an ExecutionException from the underlying future is rethrown as RuntimeException(\"Unable to move\", e) after marking the move as failed via StorageService.markMoveFailed(). The original cause is attached, so the root reason (streaming failure, timeout, node down) is in the cause chain. Other exceptions are marked failed and rethrown unchanged.","triggerScenarios":"Any ExecutionException surfaced by the move execution future: streaming session failure, peer node down during range transfer, timeout waiting for the move step, or a rejected transformation during the move.","commonSituations":"Target/source node crashes mid-move; network partition interrupts streaming; cluster busy with another topology change causing a wait/timeout; disk space exhaustion on a streaming endpoint.","solutions":["Inspect the cause chain of the RuntimeException to find the true failure (streaming error, timeout, node down)","Fix the underlying issue (restart the failed node, restore connectivity, free disk space)","Re-attempt the move once the cluster is healthy; Move supports retrying from a continuable state","Check StorageService move-failed state and logs for the streaming session that failed"],"exampleFix":"// before\ncatch (ExecutionException e)\n{\n    StorageService.instance.markMoveFailed();\n    throw new RuntimeException(\"Unable to move\", e);\n}\n// after\ncatch (ExecutionException e)\n{\n    StorageService.instance.markMoveFailed();\n    throw new RuntimeException(\"Unable to move: \" + e.getCause().getMessage(), e.getCause());\n}","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try { move.execute(); } catch (RuntimeException e) { Throwable root = e; while (root.getCause() != null) root = root.getCause(); logger.error(\"Move failed, root cause: {}\", root.getMessage(), root); StorageService.instance.markMoveFailed(); }","preventionTips":["Ensure all nodes are UP before starting a move","Check disk space and network stability on streaming endpoints","Read the cause chain — 'Unable to move' is always a wrapper","Retry the move only after fixing the root failure"],"tags":["move","execution-exception","streaming","topology"],"backgroundTag":"http-request-failed","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}