{"record":{"id":"1df0b5389b05c3b1","repo":"apache/seatunnel","slug":"no-actions-define-in-the-job-cannot-execute","errorCode":null,"errorMessage":"No actions define in the job. Cannot execute.","messagePattern":"No actions define in the job\\. Cannot execute\\.","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"seatunnel-engine/seatunnel-engine-core/src/main/java/org/apache/seatunnel/engine/core/dag/logical/LogicalDagGenerator.java","lineNumber":68,"sourceCode":"\n    public LogicalDagGenerator(\n            @NonNull List<Action> actions,\n            @NonNull JobConfig jobConfig,\n            @NonNull IdGenerator idGenerator) {\n        this(actions, jobConfig, idGenerator, false);\n    }\n\n    public LogicalDagGenerator(\n            @NonNull List<Action> actions,\n            @NonNull JobConfig jobConfig,\n            @NonNull IdGenerator idGenerator,\n            boolean isStartWithSavePoint) {\n        this.actions = actions;\n        this.jobConfig = jobConfig;\n        this.idGenerator = idGenerator;\n        this.isStartWithSavePoint = isStartWithSavePoint;\n        if (actions.isEmpty()) {\n            throw new IllegalStateException(\"No actions define in the job. Cannot execute.\");\n        }\n    }\n\n    public LogicalDag generate() {\n        actions.forEach(this::createLogicalVertex);\n        Set<LogicalEdge> logicalEdges = createLogicalEdges();\n        LogicalDag logicalDag = new LogicalDag(jobConfig, idGenerator);\n        logicalDag.getEdges().addAll(logicalEdges);\n        logicalDag.getLogicalVertexMap().putAll(logicalVertexMap);\n        logicalDag.setStartWithSavePoint(isStartWithSavePoint);\n        return logicalDag;\n    }\n\n    private void createLogicalVertex(Action action) {\n        final Long logicalVertexId = action.getId();\n        if (logicalVertexMap.containsKey(logicalVertexId)) {\n            return;\n        }","sourceCodeStart":50,"sourceCodeEnd":86,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-engine/seatunnel-engine-core/src/main/java/org/apache/seatunnel/engine/core/dag/logical/LogicalDagGenerator.java#L50-L86","documentation":"The LogicalDagGenerator constructor rejects a job whose action list is empty: a DAG with no actions cannot be planned or executed, so it fails fast with an IllegalStateException during logical DAG construction. This is an upstream invariant — a valid parsed job must contain at least one source/sink/transform action.","triggerScenarios":"Constructing new LogicalDagGenerator(Collections.emptyList(), jobConfig, idGenerator, isStartWithSavePoint) — reached when a submitted job's plan produced zero actions, e.g. an empty or malformed job config graph.","commonSituations":"Job config file missing the source/sink sections; all plugins filtered out by an upstream parse bug; submitting an empty config to the Zeta REST/job submission client; a savepoint restore path that drops all actions.","solutions":["Check the job config file contains at least one valid source and sink block (env, source, transform, sink sections).","Run the config through the SeaTunnel config parser / 'seatunnel.sh --config ... -m local' to see earlier parse errors that silently dropped actions.","If submitting programmatically, verify your built List<Action> passed to the planner is non-empty before creating LogicalDagGenerator.","If restoring from a savepoint, confirm the original job had actions and the savepoint state is not empty/corrupted."],"exampleFix":"# before (empty job)\nenv { parallelism = 1 }\n# after\nenv { parallelism = 1 }\nsource { FakeSource { plugin_output = \"fake\" } }\nsink { Console {} }","handlingStrategy":"validation","validationCode":"if (config.getPluginConfigs().isEmpty()) throw new IllegalArgumentException(\"job config must define at least one source and sink\");","typeGuard":null,"tryCatchPattern":"try { jobClient.executeJob(config); } catch (IllegalStateException e) { if (e.getMessage().contains(\"No actions\")) { log.error(\"job config produced no actions; check source/sink blocks\"); } throw e; }","preventionTips":["Validate job HOCON/YAML has non-empty source{}/sink{} blocks before submit.","Test configs with -e local first to catch planning errors early.","Never submit empty or fully-commented config files."],"tags":["dag","job-config","zeta-engine"],"backgroundTag":"empty-required-field","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T21:17:11.552Z"}