apache/iceberg · error · IllegalArgumentException
Unsupported status:
Error message
Unsupported status:
What it means
During assignSplits, the enumerator checks the SplitResult status from the split assigner; only an assignment status is supported, and any other status triggers this IllegalArgumentException. It indicates the assigner returned an unexpected internal state.
Source
Thrown at flink/v1.20/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)
Solutions
- Verify you are using the built-in Iceberg split assigner or that your custom assigner returns a supported SplitResult status.
- Align connector versions across the cluster to avoid mixed assigner/enumerator behavior.
- File/report with the SplitResult status value; this is an internal invariant violation, not user input error.
Defensive patterns
Strategy: try-catch
Try / catch
// Wrap job restart policy to capture enumerator failure cause
env.setRestartStrategy(RestartStrategies.failureRateRestart(3, Time.days(1), Time.minutes(1)));
// catch in a custom enumerator subclass if using a custom assigner:
try { assignSplits(); } catch (IllegalArgumentException e) { LOG.error("SplitResult status invalid", e); } Prevention
- Do not implement custom SplitAssigner variants that return non-standard SplitResult statuses
- Keep enumerator and assigner from the same connector release
- Capture JobManager logs when this occurs to identify the status value
When it happens
Trigger: Called from handleSourceEvent, addSplitsBack, or a future callback when the SplitAssigner's getResult().status() is something other than the expected assignment status.
Common situations: A custom SplitAssigner implementation returning a non-standard status; internal bug or version mismatch in connector components.
Understand the failure class
Background: "This is a bug, please report it": internal invariant violations, unreachable panics, and SNH errors explained — this error's family across 47 libraries.
Related errors
- Received unknown event from subtask %d: %s
- Unexpected entry status: ${entry.status}
- Unsupported version:
- Source table %s contains one/all of the reserved property ke
- Cannot create the table with 'connector'='iceberg' table pro
AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12).
Data as JSON: /api/errors/2aad152779e53de5.
Report an issue: GitHub.