apache/beam · error · IllegalArgumentException
Unknown trigger case: %s
Error message
Unknown trigger case: %s
What it means
TriggerTranslation.fromProto switches over triggerProto.getTriggerCase(); the default branch throws an IllegalArgumentException for any trigger case that the current SDK does not recognize, including newly introduced proto cases.
Source
Thrown at sdks/java/core/src/main/java/org/apache/beam/sdk/util/construction/TriggerTranslation.java:284
return AfterSynchronizedProcessingTime.ofFirstElement();
case ALWAYS:
return new ReshuffleTrigger();
case ELEMENT_COUNT:
return AfterPane.elementCountAtLeast(triggerProto.getElementCount().getElementCount());
case NEVER:
return Never.ever();
case OR_FINALLY:
return fromProto(triggerProto.getOrFinally().getMain())
.orFinally((OnceTrigger) fromProto(triggerProto.getOrFinally().getFinally()));
case REPEAT:
return Repeatedly.forever(fromProto(triggerProto.getRepeat().getSubtrigger()));
case DEFAULT:
return DefaultTrigger.of();
case TRIGGER_NOT_SET:
throw new IllegalArgumentException(
String.format("Required field 'trigger' not set in %s", triggerProto));
default:
throw new IllegalArgumentException(
String.format("Unknown trigger case: %s", triggerProto.getTriggerCase()));
}
}
private static List<Trigger> protosToTriggers(List<RunnerApi.Trigger> triggers) {
List<Trigger> result = Lists.newArrayList();
for (RunnerApi.Trigger trigger : triggers) {
result.add(fromProto(trigger));
}
return result;
}
// Do not instantiate
private TriggerTranslation() {}
}
View on GitHub (pinned to 12126d8942)
Solutions
- Upgrade the SDK to one supporting the unknown trigger case
- Rebuild/re-export the pipeline with a Beam version matching the reading SDK
- Check triggerProto.getTriggerCase() against supported cases before invoking fromProto
Example fix
// before: producer Beam 2.60 emits new trigger case, reader Beam 2.50 // after: upgrade reader SDK or regenerate pipeline with Beam 2.50
Defensive patterns
Strategy: type-guard
Validate before calling
RunnerApi.Trigger.TriggerCase c = triggerProto.getTriggerCase();
if (c == RunnerApi.Trigger.TriggerCase.TRIGGER_NOT_SET) {
throw new IllegalStateException("No trigger set");
} // additionally verify c is one of the cases your SDK version supports Type guard
boolean isSupportedTriggerCase(RunnerApi.Trigger t) {
switch (t.getTriggerCase()) {
case AFTER_ALL: case AFTER_EACH: case AFTER_FIRST: case AFTER_END_OF_WINDOW:
case ELEMENT_COUNT: case NEVER: case OR_FINALLY: case ALWAYS: case REPEAT: case DEFAULT:
return true;
default: return false;
}
} Try / catch
try {
TriggerTranslation.fromProto(triggerProto);
} catch (IllegalArgumentException e) {
// unknown trigger case: upgrade SDK or remap
} Prevention
- Keep all Beam SDK versions in the pipeline lifecycle aligned
- Audit stored pipeline templates after Beam upgrades
When it happens
Trigger: Reading a pipeline proto whose Trigger oneof holds a case added in a newer Beam version than the SDK performing translation.
Common situations: Beam version skew between pipeline producers and consumers; custom proto extensions; running an older SDK against pipelines from Flink runner JobGraphs or templates generated by newer Beam.
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
- Unknown %s: %s
- Unknown timestamp transform case: %s
- Unrecognized value for stable unique names:
- Unknown ValueKind number: {}
- Required field 'timestamp_transform' not set in %s
AI-assisted analysis of apache/beam@12126d8942 (2026-09-13).
Data as JSON: /api/errors/4e1a1be4ecf96d99.
Report an issue: GitHub.