apache/seatunnel · error · JobDefineCheckException

The '%s' option configured in [%s] is incorrect, and the sou

Error message

The '%s' option configured in [%s] is incorrect, and the source/transform[%s] is not found.

What it means

checkInputId verifies that every plugin_input id referenced by a transform/sink actually matches a registered source/transform output id in the DAG. If a referenced id was never produced, JobDefineCheckException is thrown saying the source/transform was not found. This catches dangling edges in multi-table job configs.

Source

Thrown at seatunnel-engine/seatunnel-engine-core/src/main/java/org/apache/seatunnel/engine/core/parse/ConfigParserUtil.java:206

                                            id));
                        }
                        return new Tuple2<>(config, VertexStatus.CREATED);
                    });
        }
    }

    private static void checkInputId(
            List<? extends Config> configs,
            Map<String, Tuple2<Config, VertexStatus>> vertexStatusMap) {
        for (Config config : configs) {
            List<String> inputIds = getInputIds(ReadonlyConfig.fromConfig(config));
            inputIds.forEach(
                    inputId ->
                            vertexStatusMap.compute(
                                    inputId,
                                    (id, old) -> {
                                        if (old == null) {
                                            throw new JobDefineCheckException(
                                                    String.format(
                                                            "The '%s' option configured in [%s] is incorrect, and the source/transform[%s] is not found.",
                                                            PLUGIN_INPUT.key(),
                                                            config.getString(PLUGIN_NAME.key()),
                                                            id));
                                        }
                                        return new Tuple2<>(old._1(), VertexStatus.LINKED);
                                    }));
        }
    }

    private static void checkLinked(Map<String, Tuple2<Config, VertexStatus>> vertexStatusMap) {
        vertexStatusMap.forEach(
                (id, vertex) -> {
                    if (vertex._2() == VertexStatus.CREATED) {
                        throw new JobDefineCheckException(
                                String.format(
                                        "The '%s' option configured is incorrect, this table(%s) belonging to source/transform(%s) is not used.",

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Fix the plugin_input value to exactly match an existing plugin_output id
  2. Ensure the upstream plugin sets plugin_output with that exact id
  3. Check for typos/case differences between plugin_output and plugin_input values
  4. Confirm the upstream source/transform block is present and not commented out

Example fix

// before
source { FakeSource { plugin_output = "src" } }
sink { Console { plugin_input = "sorce" } }
// after
source { FakeSource { plugin_output = "src" } }
sink { Console { plugin_input = "src" } }
Defensive patterns

Strategy: validation

Validate before calling

Set<String> produced = collectPluginOutputs(config);
for (String input : collectPluginInputs(config)) {
    if (!produced.contains(input)) {
        throw new IllegalArgumentException("Unknown plugin_input: " + input);
    }
}

Try / catch

try {
    ConfigParserUtil.checkInputId(...);
} catch (JobDefineCheckException e) {
    log.error("Dangling plugin_input reference: {}", e.getMessage());
    throw e;
}

Prevention

When it happens

Trigger: A transform or sink config references plugin_input (or source_table_name) with a value that no upstream plugin declares as plugin_output; complex-graph validation via checkComplexGraph.

Common situations: Typo in plugin_input value; upstream plugin renamed or removed; plugin_output missing on the intended producer (so its default id differs); multi-table job where the producer block is commented out.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/98b132df6e7329f4. Report an issue: GitHub.