{"record":{"id":"fb6a22c5a15715b7","repo":"apache/seatunnel","slug":"no-checkpoint-found-for-jobid-jobid-restoremod","errorCode":null,"errorMessage":"No checkpoint found for jobId=${jobId}, restoreMode=${restoreMode}, restoreSourceJobId=${restoreSourceJobId}","messagePattern":"No checkpoint found for jobId=(.+?), restoreMode=(.+?), restoreSourceJobId=(.+?)","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/rest/RestJobExecutionEnvironment.java","lineNumber":153,"sourceCode":"        jarUrls.addAll(commonPluginJars);\n        jarUrls.addAll(immutablePair.getRight());\n        actions.forEach(\n                action -> {\n                    addCommonPluginJarsToAction(\n                            action, new HashSet<>(commonPluginJars), Collections.emptySet());\n                });\n        return getLogicalDagGenerator().generate();\n    }\n\n    @Override\n    protected MultipleTableJobConfigParser getJobConfigParser() {\n        List<JobPipelineCheckpointData> pipelineCheckpoints = Collections.emptyList();\n        if (restoreMode.isRestore()) {\n            LOGGER.info(\n                    String.format(\"Start with %s, get checkpoint state from server\", restoreMode));\n            pipelineCheckpoints = loadPipelineCheckpointsFromMasterNode();\n            if (pipelineCheckpoints == null || pipelineCheckpoints.isEmpty()) {\n                throw new IllegalArgumentException(\n                        \"No checkpoint found for jobId=\"\n                                + jobConfig.getJobContext().getJobId()\n                                + \", restoreMode=\"\n                                + restoreMode\n                                + \", restoreSourceJobId=\"\n                                + restoreSourceJobId);\n            }\n        }\n        MetadataConfig metaDataConfig =\n                seaTunnelServer.getSeaTunnelConfig().getEngineConfig().getMetadataConfig();\n        return new MultipleTableJobConfigParser(\n                seaTunnelJobConfig,\n                idGenerator,\n                jobConfig,\n                commonPluginJars,\n                restoreMode.isRestore(),\n                pipelineCheckpoints,\n                metaDataConfig);","sourceCodeStart":135,"sourceCodeEnd":171,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/rest/RestJobExecutionEnvironment.java#L135-L171","documentation":"When starting a job from the REST API in a restore mode (savepoint/restore), RestJobExecutionEnvironment loads the checkpoint state for the source job from the master node. If the returned list of pipeline checkpoint data is empty or null, it throws IllegalArgumentException because there is nothing to restore the job's state from.","triggerScenarios":"GET/POST submission with isStartWithSavePoint/restoreMode set and a restoreSourceJobId whose checkpoint data does not exist or has been purged (e.g. job history expired, savepoint never taken, wrong jobId).","commonSituations":"Typo in restoreSourceJobId; the original job was canceled without savepoint; checkpoint storage cleaned or cluster state (running-job-state map) lost after cluster restart; restore attempted from a different cluster without shared storage.","solutions":["Confirm restoreSourceJobId points to a job that actually completed a savepoint (check via REST job info endpoints)","Use the jobId of the source job for savepoint restore if restoreSourceJobId is not provided (legacy contract fills it automatically)","Verify the checkpoint storage (hdfs/s3/local) is reachable and contains the state files","Re-run the original job with stop-with-savepoint to generate a valid savepoint before restoring"],"exampleFix":"// before: wrong/absent savepoint source\nPOST /submit-job?jobId=123&isStartWithSavePoint=true\n// after: ensure source job 123 has a savepoint, then restore\nPOST /submit-job?isStartWithSavePoint=true&restoreSourceJobId=123","handlingStrategy":"validation","validationCode":"// ensure the source job has savepoint data before restore\ncurl http://master:8080/job-info/:restoreSourceJobId  # verify checkpoints/savepoint exist","typeGuard":null,"tryCatchPattern":"try {\n    submitRestoreJob();\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().contains(\"No checkpoint found\")) {\n        // take a fresh savepoint of the source job first\n    }\n}","preventionTips":["Always stop-with-savepoint the source job before restoring","Record and reuse the exact source jobId","Ensure checkpoint storage persists across cluster restarts"],"tags":["zeta-engine","rest-api","savepoint","restore"],"backgroundTag":"checkpoint-not-found","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}