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

  1. Upgrade the SDK to one supporting the unknown trigger case
  2. Rebuild/re-export the pipeline with a Beam version matching the reading SDK
  3. 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

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


AI-assisted analysis of apache/beam@12126d8942 (2026-09-13). Data as JSON: /api/errors/4e1a1be4ecf96d99. Report an issue: GitHub.