apache/seatunnel · error · JobDefineCheckException

All candidate sink tables were skipped during job parsing.

Error message

All candidate sink tables were skipped during job parsing.

What it means

Thrown by MultipleTableJobConfigParser.parse() when every sink table config was skipped during parsing (no sink actions were produced) and at least one table previously failed. Because the multi-table tolerance mode silently skips broken sinks, this final check guarantees a job is never submitted with zero sinks; it aggregates the per-table failures into a summary message.

Source

Thrown at seatunnel-engine/seatunnel-engine-core/src/main/java/org/apache/seatunnel/engine/core/parse/MultipleTableJobConfigParser.java:292

                    && MultiTableFailureHelper.shouldContinueOtherTables(envOptions)) {
                throw new JobDefineCheckException(
                        "No source tables were available after discovery. "
                                + "Check source-side failed-table warnings for details.");
            }

            log.info("start generating all transforms.");
            parseTransforms(transformConfigs, sourceAndTransformClassLoader, tableWithActionMap);

            Thread.currentThread().setContextClassLoader(sinkClassLoader);
            log.info("start generating all sinks.");
            List<Action> sinkActions = new ArrayList<>();
            for (int configIndex = 0; configIndex < sinkConfigs.size(); configIndex++) {
                Config sinkConfig = sinkConfigs.get(configIndex);
                sinkActions.addAll(
                        parseSink(configIndex, sinkConfig, sinkClassLoader, tableWithActionMap));
            }
            if (sinkActions.isEmpty() && !failedTables.isEmpty()) {
                throw new JobDefineCheckException(
                        buildFailureSummary(
                                "All candidate sink tables were skipped during job parsing."));
            }
            if (!failedTables.isEmpty()) {
                log.warn(
                        buildFailureSummary(
                                "Some tables were skipped during multi-table job parsing."));
            }
            Set<URL> factoryUrls = getUsedFactoryUrls(sinkActions);
            return new ImmutablePair<>(sinkActions, factoryUrls);
        } finally {
            Thread.currentThread().setContextClassLoader(parentClassLoader);
            if (classLoaderService != null) {
                classLoaderService.releaseClassLoader(
                        Long.parseLong(jobConfig.getJobContext().getJobId()), sourceJars);
                classLoaderService.releaseClassLoader(
                        Long.parseLong(jobConfig.getJobContext().getJobId()), sinkConnectorJars);
            }

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Read the aggregated failure summary in the exception and the WARN lines listing each skipped table's cause.
  2. Fix each sink table's catalog config (connection, credentials, table existence).
  3. Enable auto-create-table / CREATE_SCHEMA_SAVE_MODE appropriately if sink tables should be created.
  4. Verify the sink connector plugin jar is present on the cluster.
  5. If failures are intentional, remove those tables from the config rather than relying on silent skips.

Example fix

// before
sink {
  Jdbc {
    url = "jdbc:mysql://localhost:3306/missing_schema"
    table = "results.summary"
  }
}
// after
sink {
  Jdbc {
    url = "jdbc:mysql://localhost:3306/results"
    table = "results.summary"
    generate_sink_sql = true
    schema_save_mode = "CREATE_SCHEMA_WHEN_NOT_EXIST"
  }
}
Defensive patterns

Strategy: validation

Validate before calling

// pre-check sink tables exist (or will be auto-created)
for (String table : sinkTables) {
  if (!autoCreate && !catalog.tableExists(table)) {
    throw new IllegalStateException("Sink table missing: " + table);
  }
}

Try / catch

try {
  engine.submitJob(config);
} catch (JobDefineCheckException e) {
  if (e.getMessage().startsWith("All candidate sink tables were skipped")) {
    // read the aggregated summary for per-table causes
  }
}

Prevention

When it happens

Trigger: parseSink returned no actions for any sink config (all skipped due to failed upstream tables or sink-side discovery errors) while failedTables is non-empty.

Common situations: Sink table_names reference missing tables, sink catalog credentials wrong for all tables, schema mismatch caused auto create mode failures, or upstream source failures propagated so all sink branches were dropped.

Understand the failure class

Background: EmptyResultError / "no results found": when an API or scraper succeeds but returns zero rows — this error's family across 9 libraries.

Related errors


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