Skip to content

[#9536] feat(core): Add event listener for function operations#10499

Open
laserninja wants to merge 4 commits intoapache:mainfrom
laserninja:event-listener-udf-adaptation
Open

[#9536] feat(core): Add event listener for function operations#10499
laserninja wants to merge 4 commits intoapache:mainfrom
laserninja:event-listener-udf-adaptation

Conversation

@laserninja
Copy link
Contributor

Add event/listener hooks for function CRUD operations (register, get, alter, drop, list). This follows the same pattern as existing entity event dispatchers (Table, Model, etc.).

New files:

  • FunctionInfo: read-only function info for event listeners
  • FunctionEvent/FunctionFailureEvent/FunctionPreEvent: base event classes
  • Register/Get/Alter/Drop/ListFunction Event/PreEvent/FailureEvent classes
  • FunctionEventDispatcher: decorates FunctionDispatcher with event dispatching
  • TestFunctionEvent: unit tests for all function events

Modified files:

  • OperationType: added REGISTER/GET/ALTER/DROP/LIST_FUNCTION
  • GravitinoEnv: wired FunctionEventDispatcher into dispatcher chain

Closes #9536

@github-actions
Copy link

github-actions bot commented Mar 23, 2026

Code Coverage Report

Overall Project 64.94% +0.02% 🟢
Files changed 68.03% 🟢

Module Coverage
aliyun 1.73% 🔴
api 47.14% 🟢
authorization-common 85.96% 🟢
aws 1.1% 🔴
azure 2.6% 🔴
catalog-common 10.0% 🔴
catalog-fileset 80.02% 🟢
catalog-hive 80.98% 🟢
catalog-jdbc-clickhouse 79.06% 🟢
catalog-jdbc-common 42.89% 🟢
catalog-jdbc-doris 80.28% 🟢
catalog-jdbc-hologres 54.03% 🟢
catalog-jdbc-mysql 79.23% 🟢
catalog-jdbc-oceanbase 78.38% 🟢
catalog-jdbc-postgresql 82.05% 🟢
catalog-jdbc-starrocks 78.27% 🟢
catalog-kafka 77.01% 🟢
catalog-lakehouse-generic 45.07% 🟢
catalog-lakehouse-hudi 79.1% 🟢
catalog-lakehouse-iceberg 87.25% 🟢
catalog-lakehouse-paimon 77.71% 🟢
catalog-model 77.72% 🟢
cli 44.51% 🟢
client-java 77.83% 🟢
common 49.42% 🟢
core 81.08% -0.27% 🟢
filesystem-hadoop3 76.97% 🟢
flink 38.86% 🔴
flink-runtime 0.0% 🔴
gcp 14.2% 🔴
hadoop-common 10.39% 🔴
hive-metastore-common 45.82% 🟢
iceberg-common 50.21% 🟢
iceberg-rest-server 66.51% 🟢
integration-test-common 0.0% 🔴
jobs 66.17% 🟢
lance-common 23.88% 🔴
lance-rest-server 57.84% 🟢
lineage 53.02% 🟢
optimizer 82.87% 🟢
optimizer-api 21.95% 🔴
server 85.6% 🟢
server-common 69.43% 🟢
spark 32.79% 🔴
spark-common 39.09% 🔴
trino-connector 31.62% 🔴
Files
Module File Coverage
core OperationType.java 100.0% 🟢
AlterFunctionEvent.java 100.0% 🟢
AlterFunctionFailureEvent.java 100.0% 🟢
AlterFunctionPreEvent.java 100.0% 🟢
DropFunctionEvent.java 100.0% 🟢
DropFunctionFailureEvent.java 100.0% 🟢
DropFunctionPreEvent.java 100.0% 🟢
FunctionEvent.java 100.0% 🟢
FunctionFailureEvent.java 100.0% 🟢
FunctionPreEvent.java 100.0% 🟢
GetFunctionEvent.java 100.0% 🟢
GetFunctionFailureEvent.java 100.0% 🟢
GetFunctionPreEvent.java 100.0% 🟢
ListFunctionEvent.java 100.0% 🟢
ListFunctionFailureEvent.java 100.0% 🟢
ListFunctionInfosEvent.java 100.0% 🟢
ListFunctionPreEvent.java 100.0% 🟢
RegisterFunctionEvent.java 100.0% 🟢
RegisterFunctionFailureEvent.java 100.0% 🟢
RegisterFunctionPreEvent.java 100.0% 🟢
FunctionEventDispatcher.java 98.28% 🟢
FunctionInfo.java 96.0% 🟢
GravitinoEnv.java 10.91% 🔴

@mchades
Copy link
Contributor

mchades commented Mar 24, 2026

Hi @laserninja, thanks for your contributions—is this PR ready for review?

@laserninja laserninja marked this pull request as ready for review March 24, 2026 02:19
@laserninja
Copy link
Contributor Author

I had a question but I'll save it for after the review since it might be redundant

Add event/listener hooks for function CRUD operations (register, get,
alter, drop, list). This follows the same pattern as existing entity
event dispatchers (Table, Model, etc.).

New files:
- FunctionInfo: read-only function info for event listeners
- FunctionEvent/FunctionFailureEvent/FunctionPreEvent: base event classes
- Register/Get/Alter/Drop/ListFunction Event/PreEvent/FailureEvent classes
- FunctionEventDispatcher: decorates FunctionDispatcher with event dispatching
- TestFunctionEvent: unit tests for all function events

Modified files:
- OperationType: added REGISTER/GET/ALTER/DROP/LIST_FUNCTION
- GravitinoEnv: wired FunctionEventDispatcher into dispatcher chain

Closes apache#9536
@mchades mchades force-pushed the event-listener-udf-adaptation branch from a07f67b to 180c0b0 Compare March 24, 2026 02:37
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds event/listener hooks around function catalog operations by introducing function-specific event types and wiring a FunctionEventDispatcher into the core dispatcher chain, aligning function CRUD/list operations with the existing event-dispatching patterns used for other entities (e.g., tables/models).

Changes:

  • Introduced FunctionEventDispatcher to emit pre/success/failure events for function operations and delegate to the underlying FunctionDispatcher.
  • Added function event/info types (FunctionInfo, FunctionEvent/FunctionPreEvent/FunctionFailureEvent, and operation-specific event classes) plus new OperationType entries.
  • Added unit tests validating function event dispatch for success/failure paths.

Reviewed changes

Copilot reviewed 23 out of 23 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
core/src/test/java/org/apache/gravitino/listener/api/event/TestFunctionEvent.java Adds unit tests for function operation events (success/failure).
core/src/main/java/org/apache/gravitino/listener/FunctionEventDispatcher.java Decorator that dispatches function pre/post/failure events around function operations.
core/src/main/java/org/apache/gravitino/listener/api/info/FunctionInfo.java Read-only function info DTO used in events.
core/src/main/java/org/apache/gravitino/listener/api/event/RegisterFunctionPreEvent.java Pre-event for register function.
core/src/main/java/org/apache/gravitino/listener/api/event/RegisterFunctionFailureEvent.java Failure-event for register function.
core/src/main/java/org/apache/gravitino/listener/api/event/RegisterFunctionEvent.java Success-event for register function.
core/src/main/java/org/apache/gravitino/listener/api/event/OperationType.java Adds function operation types.
core/src/main/java/org/apache/gravitino/listener/api/event/ListFunctionPreEvent.java Pre-event for listing functions.
core/src/main/java/org/apache/gravitino/listener/api/event/ListFunctionFailureEvent.java Failure-event for listing functions.
core/src/main/java/org/apache/gravitino/listener/api/event/ListFunctionEvent.java Success-event for listing functions.
core/src/main/java/org/apache/gravitino/listener/api/event/GetFunctionPreEvent.java Pre-event for get function.
core/src/main/java/org/apache/gravitino/listener/api/event/GetFunctionFailureEvent.java Failure-event for get function.
core/src/main/java/org/apache/gravitino/listener/api/event/GetFunctionEvent.java Success-event for get function.
core/src/main/java/org/apache/gravitino/listener/api/event/FunctionPreEvent.java Base pre-event type for function operations.
core/src/main/java/org/apache/gravitino/listener/api/event/FunctionFailureEvent.java Base failure-event type for function operations.
core/src/main/java/org/apache/gravitino/listener/api/event/FunctionEvent.java Base success-event type for function operations.
core/src/main/java/org/apache/gravitino/listener/api/event/DropFunctionPreEvent.java Pre-event for drop function.
core/src/main/java/org/apache/gravitino/listener/api/event/DropFunctionFailureEvent.java Failure-event for drop function.
core/src/main/java/org/apache/gravitino/listener/api/event/DropFunctionEvent.java Success-event for drop function.
core/src/main/java/org/apache/gravitino/listener/api/event/AlterFunctionPreEvent.java Pre-event for alter function.
core/src/main/java/org/apache/gravitino/listener/api/event/AlterFunctionFailureEvent.java Failure-event for alter function.
core/src/main/java/org/apache/gravitino/listener/api/event/AlterFunctionEvent.java Success-event for alter function.
core/src/main/java/org/apache/gravitino/GravitinoEnv.java Wires FunctionEventDispatcher into the function dispatcher chain.

Copy link
Contributor

@mchades mchades left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you should also update the doc

…ate docs

- Extract PrincipalUtils.getCurrentUserName() to local variable 'user' in all
  FunctionEventDispatcher methods for consistency with ModelEventDispatcher
- Use Arrays.copyOf() instead of .clone() in AlterFunctionEvent and
  AlterFunctionFailureEvent constructors
- Add defensive copy in AlterFunctionPreEvent constructor
- Return defensive copies from functionChanges() getters in AlterFunctionEvent,
  AlterFunctionFailureEvent, AlterFunctionPreEvent
- Return defensive copy from definitions() getter in FunctionInfo
- Add function event entries to gravitino-server-config.md docs
@laserninja
Copy link
Contributor Author

Updated the doc. Thanks for the review!

@laserninja laserninja requested a review from mchades March 25, 2026 16:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Subtask] Event listener for function operations

3 participants