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
- Read the aggregated failure summary in the exception and the WARN lines listing each skipped table's cause.
- Fix each sink table's catalog config (connection, credentials, table existence).
- Enable auto-create-table / CREATE_SCHEMA_SAVE_MODE appropriately if sink tables should be created.
- Verify the sink connector plugin jar is present on the cluster.
- 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
- Validate sink table names and permissions before submission
- Set schema_save_mode explicitly when tables may not exist
- Review WARN-level failed-table logs after every parse failure
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
- No source tables were available after discovery. Check sourc
- Duplicated transform name '%s'. Transform names must be uniq
- The SQL config must contain at least one source table
- The SQL config must contain `INSERT INTO ... SELECT ...` syn
- Table name duplicate: %s
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/b20151a0e6241ed4.
Report an issue: GitHub.