{"record":{"id":"977e88bde8d5e581","repo":"apache/iceberg","slug":"invalid-operator-event-type-977e88","errorCode":null,"errorMessage":"Invalid operator event type: ","messagePattern":"Invalid operator event type: ","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"flink/v2.2/flink/src/main/java/org/apache/iceberg/flink/maintenance/operator/TriggerManagerCoordinator.java","lineNumber":48,"sourceCode":"  TriggerManagerCoordinator(String operatorName, Context context) {\n    super(operatorName, context);\n    LOG.info(\"Created TriggerManagerCoordinator: {}\", operatorName);\n  }\n\n  @Override\n  public void handleEventFromOperator(int subtask, int attemptNumber, OperatorEvent event) {\n    runInCoordinatorThread(\n        () -> {\n          LOG.debug(\n              \"Handling event from subtask {} (#{}) of {}: {}\",\n              subtask,\n              attemptNumber,\n              operatorName(),\n              event);\n          if (event instanceof LockRegisterEvent) {\n            registerLock((LockRegisterEvent) event);\n          } else {\n            throw new IllegalArgumentException(\n                \"Invalid operator event type: \" + event.getClass().getCanonicalName());\n          }\n        },\n        String.format(\n            Locale.ROOT,\n            \"handling operator event %s from subtask %d (#%d)\",\n            event.getClass(),\n            subtask,\n            attemptNumber));\n  }\n}\n","sourceCodeStart":30,"sourceCodeEnd":60,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/flink/v2.2/flink/src/main/java/org/apache/iceberg/flink/maintenance/operator/TriggerManagerCoordinator.java#L30-L60","documentation":"TriggerManagerCoordinator.handleEventFromOperator handles OperatorEvents from maintenance subtasks on the coordinator side. It only accepts LockRegisterEvent; any other event type produces this IllegalArgumentException, wrapped by Tasks.foreach with subtask/attempt context. It signals the coordinator received an event it was not designed to process.","triggerScenarios":"An OperatorEvent that is not a LockRegisterEvent (e.g. a LockReleaseEvent) is delivered to the TriggerManager coordinator, commonly from a miswired gateway or version-skewed operator event during restore.","commonSituations":"Mixing Iceberg versions across a savepoint restore, or a bug in event routing where release events are sent to the register coordinator.","solutions":["Send only LockRegisterEvent to TriggerManagerCoordinator; route LockReleaseEvent to LockRemoverCoordinator.","Use matching Iceberg versions when restoring from savepoints so event classes line up.","Review custom code paths that fetch the coordinator's OperatorEventGateway."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"if (!(event instanceof LockRegisterEvent)) {\n  LOG.warn(\"Ignoring unexpected event at TriggerManagerCoordinator: {}\", event.getClass());\n  return;\n}","typeGuard":"boolean isLockRegister(OperatorEvent e) { return e instanceof LockRegisterEvent; }","tryCatchPattern":"try {\n  coordinatorGateway.sendEventToCoordinator(new LockRegisterEvent(lockId));\n} catch (IllegalArgumentException e) {\n  LOG.error(\"TriggerManager coordinator rejected event\", e);\n}","preventionTips":["Route LockRegisterEvent only to the TriggerManager coordinator gateway.","Use the same Iceberg version for savepoint creation and restore."],"tags":["flink","operator-event","illegal-argument"],"backgroundTag":"invalid-argument-value","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}