apache/iceberg · error · IllegalArgumentException
Unsupported status
Error message
Unsupported status: {getResult.status()} What it means
Thrown by AbstractIcebergEnumerator.assignSplitsData when the SplitResult from split assignment returns a status the enumerator does not recognize. The enumerator only expects the known Flink SourceEvents split-result statuses; anything else indicates an internal incompatibility between the source reader and enumerator (typically a mixed Flink/Iceberg version deployment).
Solutions
- Ensure all TaskManagers and the job jar use the same Iceberg connector and Flink version; redeploy the whole cluster consistently.
- Clear savepoints/checkpoints created by an older connector version and restart from a fresh state.
- Upgrade the Iceberg flink-runtime jar to match the Flink minor version (e.g. iceberg-flink-runtime-1.20 for Flink 1.20).
- If reproducible, capture getResult.status() value and file an issue against the connector.
Example fix
// before: mixed jars classpath: iceberg-flink-runtime-1.19.jar with Flink 1.20 // after: aligned versions classpath: iceberg-flink-runtime-1.20.jar with Flink 1.20
Defensive patterns
Strategy: validation
Validate before calling
// before constructing/enabling the source, verify version alignment
String flink = org.apache.flink.util.FlinkVersion
.fromVersionString(env.getConfiguration().getString("pipeline.version", ""));
// log connector build version
LOGGER.info("Iceberg connector: {}", IcebergBuild.fullVersion()); Try / catch
try { enumerator.assignSplitsData(...); } catch (IllegalArgumentException e) { /* fail fast and redeploy with aligned versions */ } Prevention
- Pin the iceberg-flink-runtime version to the exact Flink minor version in build/CI.
- Deploy identical jars to JobManager and all TaskManagers.
- Test savepoint restore across the exact version pair you plan to upgrade to.
When it happens
Trigger: assignSplitsData is called from handleSourceEvent, addSplitsBack, or a pending assignment future, and getResult.status() is a value outside the expected enum/status set.
Common situations: Running an Iceberg Flink source jar whose SplitResult status constants don't match the Flink runtime version; upgrading Flink or the Iceberg connector on only some TaskManagers so serialized events carry unknown statuses.
Understand the failure class
Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.
Related errors
- Cannot apply unknown unique constraint:
- Cannot convert unknown type to Flink
- Failed to discover new splits
- Invalid operator event type
- Received invalid default split request event from subtask
AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12).
Data as JSON: /api/errors/932fa5692e17e0b9.
Report an issue: GitHub.
Appendix: source
Thrown at flink/v2.1/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/AbstractIcebergEnumerator.java:156
GetSplitResult getResult = assigner.getNext(hostname);
if (getResult.status() == GetSplitResult.Status.AVAILABLE) {
LOG.info("Assign split to subtask {}: {}", awaitingSubtask, getResult.split());
enumeratorContext.assignSplit(getResult.split(), awaitingSubtask);
awaitingReader.remove();
} else if (getResult.status() == GetSplitResult.Status.CONSTRAINED) {
getAvailableFutureIfNeeded();
break;
} else if (getResult.status() == GetSplitResult.Status.UNAVAILABLE) {
if (shouldWaitForMoreSplits()) {
getAvailableFutureIfNeeded();
break;
} else {
LOG.info("No more splits available for subtask {}", awaitingSubtask);
enumeratorContext.signalNoMoreSplits(awaitingSubtask);
awaitingReader.remove();
}
} else {
throw new IllegalArgumentException("Unsupported status: " + getResult.status());
}
}
}
/** return true if enumerator should wait for splits like in the continuous enumerator case */
protected abstract boolean shouldWaitForMoreSplits();
private synchronized void getAvailableFutureIfNeeded() {
if (availableFuture.get() != null) {
return;
}
CompletableFuture<Void> future =
assigner
.isAvailable()
.thenAccept(
ignore ->
// Must run assignSplits in coordinator threadView on GitHub (pinned to 86d9c8fc54)