{"record":{"id":"fbab88adcc4f3486","repo":"apache/seatunnel","slug":"checkpoint-storage-is-unavailable","errorCode":null,"errorMessage":"Checkpoint storage is unavailable","messagePattern":"Checkpoint storage is unavailable","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/master/JobMaster.java","lineNumber":388,"sourceCode":"        if (checkpointEnabled && startWithSavePoint) {\n            throw new IllegalStateException(\n                    \"Checkpoint is enabled and job starts with savepoint, but checkpoint storage is not available\");\n        }\n\n        // When checkpoint is disabled, CheckpointManager will not touch the storage. We still need\n        // a non-null placeholder to avoid NPEs during job initialization (especially in local\n        // example runs where SeaTunnelServer components may initialize asynchronously).\n        return new UnsupportedCheckpointStorage();\n    }\n\n    private static final class UnsupportedCheckpointStorage implements CheckpointStorage {\n        private static UnsupportedOperationException unavailable() {\n            return new UnsupportedOperationException(\"Checkpoint storage is unavailable\");\n        }\n\n        @Override\n        public String storeCheckPoint(PipelineState state) {\n            throw unavailable();\n        }\n\n        @Override\n        public void asyncStoreCheckPoint(PipelineState state) {\n            throw unavailable();\n        }\n\n        @Override\n        public List<PipelineState> getAllCheckpoints(String jobId) {\n            throw unavailable();\n        }\n\n        @Override\n        public List<PipelineState> getLatestCheckpoint(String jobId) {\n            throw unavailable();\n        }\n\n        @Override","sourceCodeStart":370,"sourceCodeEnd":406,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/master/JobMaster.java#L370-L406","documentation":"JobMaster's checkpoint storage delegate has not been initialized, so its CheckpointStorageOperations implementation is a stub that throws UnsupportedOperationException('Checkpoint storage is unavailable') for every checkpoint operation. storeCheckPoint would persist a pipeline's checkpoint state but the backing storage is not wired up in this JobMaster instance.","triggerScenarios":"Calling JobMaster.storeCheckPoint(PipelineState) on a JobMaster whose checkpoint storage accessor is not available — typically before/without proper checkpoint storage initialization or in a mode where checkpoint persistence is disabled.","commonSituations":"Running jobs with checkpointing expected but the checkpoint storage service (e.g. IMap-based storage on the master node) failed to initialize; calling checkpoint APIs programmatically against a JobMaster constructed in tests or degraded mode; engine version changes that altered checkpoint storage bootstrap.","solutions":["Verify the job was submitted with checkpointing enabled and that the Zeta master node initialized checkpoint storage successfully","Inspect master node logs for earlier initialization errors that left the checkpoint storage unavailable and fix the root cause","Restart the cluster so the JobMaster rebuilds its checkpoint storage binding before the job restores/saves state","If running programmatically/tests, construct the JobMaster with a real checkpoint storage implementation rather than the unavailable stub"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// Before relying on checkpoint persistence, verify the master's storage is bound:\n// check job checkpointing config and master startup logs; there is no public API flag,\n// so guard operationally.\nboolean checkpointStorageReady = jobMaster != null && clusterMasterLogsShowCheckpointStorageInitialized;","typeGuard":null,"tryCatchPattern":"try {\n    jobMaster.storeCheckPoint(pipelineState);\n} catch (UnsupportedOperationException e) {\n    if (\"Checkpoint storage is unavailable\".equals(e.getMessage())) {\n        // re-init/restart master checkpoint storage, then retry\n    } else {\n        throw e;\n    }\n}","preventionTips":["Enable checkpointing correctly in the job config so the engine initializes checkpoint storage at master startup","Monitor master node logs for checkpoint storage bootstrap failures","Restart the Zeta cluster after any storage init failure before resuming jobs","Avoid calling JobMaster checkpoint APIs on stub/test instances without a real storage"],"tags":["zeta","checkpoint","engine","sea-tunnel"],"backgroundTag":"unsupported-operation","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}