{"record":{"id":"4735ad53e4e7691e","repo":"apache/seatunnel","slug":"no-checkpoint-found-job-jobid-pipeline-pip-4735ad","errorCode":null,"errorMessage":"No checkpoint found, job(${jobId}), pipeline(${pipelineId}), checkpoint(${checkpointId})","messagePattern":"No checkpoint found, job\\((.+?)\\), pipeline\\((.+?)\\), checkpoint\\((.+?)\\)","errorType":"exception","errorClass":"CheckpointStorageException","httpStatus":null,"severity":"error","filePath":"seatunnel-engine/seatunnel-engine-storage/checkpoint-storage-plugins/checkpoint-storage-local-file/src/main/java/org/apache/seatunnel/engine/checkpoint/storage/localfile/LocalFileStorage.java","lineNumber":318,"sourceCode":"        }\n        for (File file : fileList) {\n            String fileName = file.getName();\n            if (pipelineId.equals(getPipelineIdByFileName(fileName))\n                    && checkpointId.equals(getCheckpointIdByFileName(fileName))) {\n                try {\n                    byte[] data = FileUtils.readFileToByteArray(file);\n                    return deserializeCheckPointData(data);\n                } catch (Exception e) {\n                    log.error(\n                            \"Failed to delete checkpoint {} for job {}, pipeline {}\",\n                            checkpointId,\n                            jobId,\n                            pipelineId,\n                            e);\n                }\n            }\n        }\n        throw new CheckpointStorageException(\n                String.format(\n                        \"No checkpoint found, job(%s), pipeline(%s), checkpoint(%s)\",\n                        jobId, pipelineId, checkpointId));\n    }\n\n    @Override\n    public synchronized void deleteCheckpoint(String jobId, String pipelineId, String checkpointId)\n            throws CheckpointStorageException {\n        String parentPath = getStorageParentDirectory() + jobId;\n        Collection<File> fileList = new ArrayList<>();\n        try {\n            fileList = FileUtils.listFiles(new File(parentPath), FILE_EXTENSIONS, false);\n        } catch (Exception e) {\n            if (!(e.getCause() instanceof NoSuchFileException)) {\n                throw new CheckpointStorageException(ExceptionUtils.getMessage(e));\n            }\n        }\n        if (fileList.isEmpty()) {","sourceCodeStart":300,"sourceCodeEnd":336,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-engine/seatunnel-engine-storage/checkpoint-storage-plugins/checkpoint-storage-local-file/src/main/java/org/apache/seatunnel/engine/checkpoint/storage/localfile/LocalFileStorage.java#L300-L336","documentation":"LocalFileStorage.getCheckpoint throws CheckpointStorageException after exhausting all candidate files without finding a readable checkpoint whose file name matches the requested job, pipeline, and checkpoint id. Each candidate file that fails to parse is logged (with the underlying exception) and skipped; if none match or deserialize, this terminal 'No checkpoint found' error is thrown. It signals the checkpoint data is absent or unreadable/corrupt for the given ids.","triggerScenarios":"Calling getCheckpoint(jobId, pipelineId, checkpointId) when the job directory contains no files named for that pipeline/checkpoint combination, or all matching files fail to deserialize (corrupt/partially written checkpoint data files).","commonSituations":"Requesting a checkpoint id that was never completed (only completed checkpoints are stored); checkpoint files truncated by an abrupt node kill; local storage lost after a container restart in Kubernetes; asking for checkpoints from a job that ran on a different node with non-shared local storage.","solutions":["Verify the jobId/pipelineId/checkpointId triple actually exists — list the files under the storage directory for the job.","Check the preceding log lines: the method logs the per-file exception (e) with jobId/pipelineId, revealing whether files are corrupt.","If files are truncated/corrupt, recover from an earlier completed checkpoint or re-run the job.","For multi-node deployments, use a shared checkpoint storage plugin (e.g. HDFS/OSS/S3) instead of local file so the data is reachable from the querying node."],"exampleFix":"// before\nstorage.getCheckpoint(jobId, pipelineId, latestCheckpointId); // throws if file unreadable\n// after\ntry {\n    return storage.getCheckpoint(jobId, pipelineId, latestCheckpointId);\n} catch (CheckpointStorageException e) {\n    log.warn(\"Checkpoint {}/{}/{} unavailable, falling back\", jobId, pipelineId, latestCheckpointId, e);\n    return storage.getLatestCheckpointByJobIdAndPipelineId(jobId, pipelineId);\n}","handlingStrategy":"fallback","validationCode":"// Verify the checkpoint file actually exists before requesting it\njava.nio.file.Path jobDir = java.nio.file.Path.of(storageParentDir, jobId);\nboolean exists = java.nio.file.Files.isDirectory(jobDir)\n    && java.util.stream.Stream.of(jobDir.toFile().listFiles()).anyMatch(f -> f.getName().contains(pipelineId));","typeGuard":null,"tryCatchPattern":"try {\n    return storage.getCheckpoint(jobId, pipelineId, checkpointId);\n} catch (CheckpointStorageException e) {\n    log.warn(\"Checkpoint {}/{}/{} not found or unreadable; falling back to latest\", jobId, pipelineId, checkpointId, e);\n    return storage.getLatestCheckpointByJobIdAndPipelineId(jobId, pipelineId);\n}","preventionTips":["Only request checkpoint ids that were reported as completed (snapshot finish) by the engine.","Use shared checkpoint storage in multi-node/Kubernetes deployments; local files vanish with the pod.","Check per-file skip logs emitted just before this error to detect corrupt/truncated checkpoint data.","Configure a redundant checkpoint storage plugin for critical jobs."],"tags":["checkpoint","local-file-storage","not-found","recovery"],"backgroundTag":"file-not-found","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}