{"record":{"id":"846bd3c2bb550f15","repo":"apache/seatunnel","slug":"job-s-not-found","errorCode":null,"errorMessage":"Job %s not found","messagePattern":"Job (.+?) not found","errorType":"exception","errorClass":"JobNotFoundException","httpStatus":null,"severity":"error","filePath":"seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/CoordinatorService.java","lineNumber":1908,"sourceCode":"            return jobInfo;\n        }\n\n        JobMaster runningJobMaster = runningJobMasterMap.get(jobId);\n        if (runningJobMaster != null) {\n            return runningJobMaster.getJobDAGInfo();\n        }\n\n        PendingJobInfo pendingJobInfo = pendingJobQueue.getById(jobId);\n        if (pendingJobInfo != null) {\n            return pendingJobInfo.getJobMaster().getJobDAGInfo();\n        }\n\n        JobInfo runningJobInfo = runningJobInfoIMap.get(jobId);\n        if (runningJobInfo != null) {\n            return restoreJobDAGInfo(runningJobInfo);\n        }\n\n        throw new JobNotFoundException(String.format(\"Job %s not found\", jobId));\n    }\n\n    private JobDAGInfo restoreJobDAGInfo(JobInfo jobInfo) {\n        JobImmutableInformation jobImmutableInformation = restoreJobImmutableInformation(jobInfo);\n        return restoreJobDAGInfo(jobImmutableInformation);\n    }\n\n    private JobDAGInfo restoreJobDAGInfo(JobImmutableInformation jobImmutableInformation) {\n        ClassLoaderService classLoaderService = seaTunnelServer.getClassLoaderService();\n        LogicalDag logicalDag =\n                DAGUtils.restoreLogicalDag(\n                        jobImmutableInformation,\n                        nodeEngine.getSerializationService(),\n                        classLoaderService);\n        return DAGUtils.getJobDAGInfo(\n                logicalDag,\n                jobImmutableInformation,\n                engineConfig,","sourceCodeStart":1890,"sourceCodeEnd":1926,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/CoordinatorService.java#L1890-L1926","documentation":"CoordinatorService.getJobDAGInfo (getRunningJobDAGInfo path) throws JobNotFoundException when neither the running job info IMap nor restore data holds the requested jobId. It means the master node has no record of this job's DAG: the job never ran on this cluster, was fully released/finished and purged, or state was lost (e.g. IMap persistence absent after cluster restart).","triggerScenarios":"Calling getJobDAGInfo/getRunningJobDAGInfo via REST or SeaTunnelClient for a jobId that is not present in runningJobInfoIMap and cannot be restored; querying after the job finished and its JobMaster was released; querying a different cluster than the one that ran the job.","commonSituations":"Typo in jobId passed to the REST endpoint /seatunnel/running-job/{jobId}; polling a finished job's DAG info; cluster restarted without checkpoint/imap persistence so job metadata is gone; pointing the client at the wrong cluster (dev vs prod).","solutions":["Verify the jobId is correct and the job is still running: list jobs (REST /hazelcast/rest/maps/running-jobs or bin/seatunnel.sh -l) before querying its DAG.","For finished jobs, use the job info/history APIs (job state from running-jobs or finished-jobs endpoints) instead of the running DAG endpoint.","Confirm you are querying the same cluster that ran the job (check cluster name and Hazelcast connection settings).","If job metadata disappears after restart, enable/check IMap persistence (seatunnel.yaml connector package / persistence settings) and rely on checkpoint storage for restore."],"exampleFix":"// before: blindly fetch DAG for a saved jobId\nJobDAGInfo info = client.getJobDAGInfo(jobId);\n// after: check job state first\nJobState state = client.getJobState(jobId); // throws/returns unknown if job absent\nif (state != null) {\n    JobDAGInfo info = client.getJobDAGInfo(jobId);\n}","handlingStrategy":"validation","validationCode":"List<RunningJobInfo> jobs = client.listJobs(true); // or REST /running-jobs\nif (jobs.stream().noneMatch(j -> j.getJobId() == targetJobId)) {\n    throw new IllegalArgumentException(\"Job \" + targetJobId + \" is not running on this cluster\");\n}","typeGuard":"boolean jobExists(long jobId, Set<Long> knownJobIds) { return knownJobIds.contains(jobId); }","tryCatchPattern":"try {\n    JobDAGInfo info = client.getJobDAGInfo(jobId);\n} catch (JobNotFoundException e) {\n    log.warn(\"Job {} has no DAG info (not running or purged)\", jobId);\n}","preventionTips":["Fetch the running-job list before querying DAG details for a specific jobId","Use finished-jobs/history endpoints for completed jobs instead of the running-DAG API","Verify you are connected to the intended cluster (cluster name, addresses)"],"tags":["seatunnel","zeta-engine","job-not-found","rest-api"],"backgroundTag":"entity-not-found","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}