This is an automated email from the ASF dual-hosted git repository.

jshao pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/main by this push:
     new e9acd15a8 [#5112] feat(core): support pre event for event listener 
systems (#5110)
e9acd15a8 is described below

commit e9acd15a8586f75a2e95a95753030620906aa20b
Author: FANNG <xiaoj...@datastrato.com>
AuthorDate: Tue Oct 15 15:42:28 2024 +0800

    [#5112] feat(core): support pre event for event listener systems (#5110)
    
    ### What changes were proposed in this pull request?
    support pre event for event listener systems
    1. add new `PreEvent` to represent Pre event and only `SYNC` event
    listeners could process `PreEvent`
    2. keep `Event` as post event to keep compatibility.
    3. `EventBus` dispatch event to corresponding event listeners.
    
    ### Why are the changes needed?
    Fix: #5112
    
    ### Does this PR introduce _any_ user-facing change?
    no
    
    ### How was this patch tested?
    add UT
---
 .../gravitino/listener/AsyncQueueListener.java     |  49 +++++---
 .../org/apache/gravitino/listener/EventBus.java    |  37 ++++--
 .../listener/EventListenerPluginWrapper.java       |  37 +++++-
 .../listener/api/EventListenerPlugin.java          |  30 +++--
 .../api/event/{Event.java => BaseEvent.java}       |   4 +-
 .../apache/gravitino/listener/api/event/Event.java |  57 +--------
 .../gravitino/listener/api/event/PreEvent.java     |  31 +++++
 .../gravitino/listener/DummyEventListener.java     |  37 ++++--
 .../listener/TestEventListenerManager.java         | 133 ++++++++++++++++++---
 .../listener/api/event/TestCatalogEvent.java       |  24 ++--
 .../listener/api/event/TestFilesetEvent.java       |  26 ++--
 .../listener/api/event/TestMetalakeEvent.java      |  20 ++--
 .../listener/api/event/TestPartitionEvent.java     |  24 ++--
 .../listener/api/event/TestSchemaEvent.java        |  20 ++--
 .../listener/api/event/TestTableEvent.java         |  24 ++--
 .../listener/api/event/TestTopicEvent.java         |  20 ++--
 16 files changed, 375 insertions(+), 198 deletions(-)

diff --git 
a/core/src/main/java/org/apache/gravitino/listener/AsyncQueueListener.java 
b/core/src/main/java/org/apache/gravitino/listener/AsyncQueueListener.java
index 641bc3eb5..18043964d 100644
--- a/core/src/main/java/org/apache/gravitino/listener/AsyncQueueListener.java
+++ b/core/src/main/java/org/apache/gravitino/listener/AsyncQueueListener.java
@@ -29,7 +29,9 @@ import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicLong;
 import org.apache.gravitino.listener.api.EventListenerPlugin;
+import org.apache.gravitino.listener.api.event.BaseEvent;
 import org.apache.gravitino.listener.api.event.Event;
+import org.apache.gravitino.listener.api.event.PreEvent;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -44,7 +46,7 @@ public class AsyncQueueListener implements 
EventListenerPlugin {
   private static final String NAME_PREFIX = "async-queue-listener-";
 
   private final List<EventListenerPlugin> eventListeners;
-  private final BlockingQueue<Event> queue;
+  private final BlockingQueue<BaseEvent> queue;
   private final Thread asyncProcessor;
   private final int dispatcherJoinSeconds;
   private final AtomicBoolean stopped = new AtomicBoolean(false);
@@ -68,20 +70,13 @@ public class AsyncQueueListener implements 
EventListenerPlugin {
   }
 
   @Override
-  public void onPostEvent(Event event) {
-    if (stopped.get()) {
-      LOG.warn(
-          "{} drop event: {}, since AsyncQueueListener is stopped",
-          asyncQueueListenerName,
-          event.getClass().getSimpleName());
-      return;
-    }
-
-    if (queue.offer(event)) {
-      return;
-    }
+  public void onPreEvent(PreEvent event) {
+    enqueueEvent(event);
+  }
 
-    logDropEventsIfNecessary();
+  @Override
+  public void onPostEvent(Event event) {
+    enqueueEvent(event);
   }
 
   @Override
@@ -117,8 +112,14 @@ public class AsyncQueueListener implements 
EventListenerPlugin {
   private void processEvents() {
     while (!Thread.currentThread().isInterrupted()) {
       try {
-        Event event = queue.take();
-        this.eventListeners.forEach(listener -> listener.onPostEvent(event));
+        BaseEvent baseEvent = queue.take();
+        if (baseEvent instanceof PreEvent) {
+          this.eventListeners.forEach(listener -> 
listener.onPreEvent((PreEvent) baseEvent));
+        } else if (baseEvent instanceof Event) {
+          this.eventListeners.forEach(listener -> listener.onPostEvent((Event) 
baseEvent));
+        } else {
+          LOG.warn("Unknown event type: {}", 
baseEvent.getClass().getSimpleName());
+        }
       } catch (InterruptedException e) {
         LOG.warn("{} event dispatcher thread is interrupted.", 
asyncQueueListenerName);
         break;
@@ -154,4 +155,20 @@ public class AsyncQueueListener implements 
EventListenerPlugin {
       }
     }
   }
+
+  private void enqueueEvent(BaseEvent baseEvent) {
+    if (stopped.get()) {
+      LOG.warn(
+          "{} drop event: {}, since AsyncQueueListener is stopped",
+          asyncQueueListenerName,
+          baseEvent.getClass().getSimpleName());
+      return;
+    }
+
+    if (queue.offer(baseEvent)) {
+      return;
+    }
+
+    logDropEventsIfNecessary();
+  }
 }
diff --git a/core/src/main/java/org/apache/gravitino/listener/EventBus.java 
b/core/src/main/java/org/apache/gravitino/listener/EventBus.java
index 6b18f9a5a..d851dc292 100644
--- a/core/src/main/java/org/apache/gravitino/listener/EventBus.java
+++ b/core/src/main/java/org/apache/gravitino/listener/EventBus.java
@@ -21,8 +21,11 @@ package org.apache.gravitino.listener;
 
 import com.google.common.annotations.VisibleForTesting;
 import java.util.List;
+import org.apache.gravitino.exceptions.ForbiddenException;
 import org.apache.gravitino.listener.api.EventListenerPlugin;
+import org.apache.gravitino.listener.api.event.BaseEvent;
 import org.apache.gravitino.listener.api.event.Event;
+import org.apache.gravitino.listener.api.event.PreEvent;
 
 /**
  * The {@code EventBus} class serves as a mechanism to dispatch events to 
registered listeners. It
@@ -34,26 +37,32 @@ public class EventBus {
   // EventListenerPluginWrapper,
   // which are meant for synchronous event listening, or AsyncQueueListener, 
designed for
   // asynchronous event processing.
-  private final List<EventListenerPlugin> postEventListeners;
+  private final List<EventListenerPlugin> eventListeners;
 
   /**
    * Constructs an EventBus with a predefined list of event listeners.
    *
-   * @param postEventListeners A list of {@link EventListenerPlugin} instances 
that are to be
-   *     registered with this EventBus for event dispatch.
+   * @param eventListeners A list of {@link EventListenerPlugin} instances 
that are to be registered
+   *     with this EventBus for event dispatch.
    */
-  public EventBus(List<EventListenerPlugin> postEventListeners) {
-    this.postEventListeners = postEventListeners;
+  public EventBus(List<EventListenerPlugin> eventListeners) {
+    this.eventListeners = eventListeners;
   }
 
   /**
    * Dispatches an event to all registered listeners. Each listener processes 
the event based on its
    * implementation, which could be either synchronous or asynchronous.
    *
-   * @param event The event to be dispatched to all registered listeners.
+   * @param baseEvent The event to be dispatched to all registered listeners.
    */
-  public void dispatchEvent(Event event) {
-    postEventListeners.forEach(postEventListener -> 
postEventListener.onPostEvent(event));
+  public void dispatchEvent(BaseEvent baseEvent) {
+    if (baseEvent instanceof PreEvent) {
+      dispatchPreEvent((PreEvent) baseEvent);
+    } else if (baseEvent instanceof Event) {
+      dispatchPostEvent((Event) baseEvent);
+    } else {
+      throw new RuntimeException("Unknown event type:" + 
baseEvent.getClass().getSimpleName());
+    }
   }
 
   /**
@@ -64,7 +73,15 @@ public class EventBus {
    *     EventBus.
    */
   @VisibleForTesting
-  List<EventListenerPlugin> getPostEventListeners() {
-    return postEventListeners;
+  List<EventListenerPlugin> getEventListeners() {
+    return eventListeners;
+  }
+
+  private void dispatchPostEvent(Event postEvent) {
+    eventListeners.forEach(eventListener -> 
eventListener.onPostEvent(postEvent));
+  }
+
+  private void dispatchPreEvent(PreEvent preEvent) throws ForbiddenException {
+    eventListeners.forEach(eventListener -> 
eventListener.onPreEvent(preEvent));
   }
 }
diff --git 
a/core/src/main/java/org/apache/gravitino/listener/EventListenerPluginWrapper.java
 
b/core/src/main/java/org/apache/gravitino/listener/EventListenerPluginWrapper.java
index a14833963..8e0a2ffbc 100644
--- 
a/core/src/main/java/org/apache/gravitino/listener/EventListenerPluginWrapper.java
+++ 
b/core/src/main/java/org/apache/gravitino/listener/EventListenerPluginWrapper.java
@@ -21,8 +21,11 @@ package org.apache.gravitino.listener;
 
 import com.google.common.annotations.VisibleForTesting;
 import java.util.Map;
+import org.apache.gravitino.exceptions.ForbiddenException;
 import org.apache.gravitino.listener.api.EventListenerPlugin;
+import org.apache.gravitino.listener.api.event.BaseEvent;
 import org.apache.gravitino.listener.api.event.Event;
+import org.apache.gravitino.listener.api.event.PreEvent;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -67,11 +70,27 @@ public class EventListenerPluginWrapper implements 
EventListenerPlugin {
     try {
       userEventListener.onPostEvent(event);
     } catch (Exception e) {
-      LOG.warn(
-          "Event listener {} process event {} failed,",
-          listenerName,
-          event.getClass().getSimpleName(),
-          e);
+      printExceptionInEventProcess(listenerName, event, e);
+    }
+  }
+
+  @Override
+  public void onPreEvent(PreEvent preEvent) {
+    try {
+      userEventListener.onPreEvent(preEvent);
+    } catch (ForbiddenException e) {
+      if (Mode.SYNC.equals(mode())) {
+        LOG.warn(
+            "Event listener {} process pre event {} throws ForbiddenException, 
will skip the "
+                + "operation.",
+            listenerName,
+            preEvent.getClass().getSimpleName(),
+            e);
+        throw e;
+      }
+      printExceptionInEventProcess(listenerName, preEvent, e);
+    } catch (Exception e) {
+      printExceptionInEventProcess(listenerName, preEvent, e);
     }
   }
 
@@ -79,4 +98,12 @@ public class EventListenerPluginWrapper implements 
EventListenerPlugin {
   EventListenerPlugin getUserEventListener() {
     return userEventListener;
   }
+
+  private void printExceptionInEventProcess(String listenerName, BaseEvent 
baseEvent, Exception e) {
+    LOG.warn(
+        "Event listener {} process event {} failed,",
+        listenerName,
+        baseEvent.getClass().getSimpleName(),
+        e);
+  }
 }
diff --git 
a/core/src/main/java/org/apache/gravitino/listener/api/EventListenerPlugin.java 
b/core/src/main/java/org/apache/gravitino/listener/api/EventListenerPlugin.java
index 8a0b8d982..06d5b4440 100644
--- 
a/core/src/main/java/org/apache/gravitino/listener/api/EventListenerPlugin.java
+++ 
b/core/src/main/java/org/apache/gravitino/listener/api/EventListenerPlugin.java
@@ -21,7 +21,9 @@ package org.apache.gravitino.listener.api;
 
 import java.util.Map;
 import org.apache.gravitino.annotation.DeveloperApi;
+import org.apache.gravitino.exceptions.ForbiddenException;
 import org.apache.gravitino.listener.api.event.Event;
+import org.apache.gravitino.listener.api.event.PreEvent;
 
 /**
  * Defines an interface for event listeners that manage the lifecycle and 
state of a plugin,
@@ -95,17 +97,29 @@ public interface EventListenerPlugin {
   void stop() throws RuntimeException;
 
   /**
-   * Handles events generated after the completion of an operation. 
Implementers are responsible for
-   * processing these events, which may involve additional logic to respond to 
the operation
-   * outcomes.
+   * Handle post-events generated after the completion of an operation.
    *
-   * <p>This method provides a hook for post-operation event processing, 
allowing plugins to react
-   * or adapt based on the event details.
+   * <p>This method provides a hook for post-operation event processing, you 
couldn't change the
+   * resource in the event.
    *
-   * @param event The event to be processed.
-   * @throws RuntimeException Indicates issues encountered during event 
processing.
+   * @param postEvent The post event to be processed.
+   * @throws RuntimeException Indicates issues encountered during event 
processing, this has no
+   *     affect to the operation.
    */
-  void onPostEvent(Event event) throws RuntimeException;
+  default void onPostEvent(Event postEvent) throws RuntimeException {}
+
+  /**
+   * Handle pre-events generated before the operation.
+   *
+   * <p>This method handles pre-operation events in SYNC or ASYNC mode, any 
changes to resources in
+   * the event will affect the subsequent operations.
+   *
+   * @param preEvent The pre event to be processed.
+   * @throws ForbiddenException The subsequent operation will be skipped if 
and only if the event
+   *     listener throwing {@code 
org.apache.gravitino.exceptions.ForbiddenException} and the event
+   *     listener is SYNC mode, the exception will be ignored and logged only 
in other conditions.
+   */
+  default void onPreEvent(PreEvent preEvent) throws ForbiddenException {}
 
   /**
    * Specifies the default operational mode for event processing by the 
plugin. The default
diff --git 
a/core/src/main/java/org/apache/gravitino/listener/api/event/Event.java 
b/core/src/main/java/org/apache/gravitino/listener/api/event/BaseEvent.java
similarity index 96%
copy from core/src/main/java/org/apache/gravitino/listener/api/event/Event.java
copy to 
core/src/main/java/org/apache/gravitino/listener/api/event/BaseEvent.java
index 89e233b43..973323a05 100644
--- a/core/src/main/java/org/apache/gravitino/listener/api/event/Event.java
+++ b/core/src/main/java/org/apache/gravitino/listener/api/event/BaseEvent.java
@@ -29,7 +29,7 @@ import org.apache.gravitino.annotation.DeveloperApi;
  * should provide specific details related to their individual event types.
  */
 @DeveloperApi
-public abstract class Event {
+public abstract class BaseEvent {
   private final String user;
   @Nullable private final NameIdentifier identifier;
   private final long eventTime;
@@ -42,7 +42,7 @@ public abstract class Event {
    * @param identifier The resource identifier associated with this event. 
This may refer to various
    *     types of resources such as a metalake, catalog, schema, or table, etc.
    */
-  protected Event(String user, NameIdentifier identifier) {
+  protected BaseEvent(String user, NameIdentifier identifier) {
     this.user = user;
     this.identifier = identifier;
     this.eventTime = System.currentTimeMillis();
diff --git 
a/core/src/main/java/org/apache/gravitino/listener/api/event/Event.java 
b/core/src/main/java/org/apache/gravitino/listener/api/event/Event.java
index 89e233b43..7dba616d4 100644
--- a/core/src/main/java/org/apache/gravitino/listener/api/event/Event.java
+++ b/core/src/main/java/org/apache/gravitino/listener/api/event/Event.java
@@ -19,64 +19,13 @@
 
 package org.apache.gravitino.listener.api.event;
 
-import javax.annotation.Nullable;
 import org.apache.gravitino.NameIdentifier;
 import org.apache.gravitino.annotation.DeveloperApi;
 
-/**
- * The abstract base class for all events. It encapsulates common information 
such as the user who
- * generated the event and the identifier for the resource associated with the 
event. Subclasses
- * should provide specific details related to their individual event types.
- */
+/** Represents a post event. */
 @DeveloperApi
-public abstract class Event {
-  private final String user;
-  @Nullable private final NameIdentifier identifier;
-  private final long eventTime;
-
-  /**
-   * Constructs an Event instance with the specified user and resource 
identifier details.
-   *
-   * @param user The user associated with this event. It provides context 
about who triggered the
-   *     event.
-   * @param identifier The resource identifier associated with this event. 
This may refer to various
-   *     types of resources such as a metalake, catalog, schema, or table, etc.
-   */
+public abstract class Event extends BaseEvent {
   protected Event(String user, NameIdentifier identifier) {
-    this.user = user;
-    this.identifier = identifier;
-    this.eventTime = System.currentTimeMillis();
-  }
-
-  /**
-   * Retrieves the user associated with this event.
-   *
-   * @return A string representing the user associated with this event.
-   */
-  public String user() {
-    return user;
-  }
-
-  /**
-   * Retrieves the resource identifier associated with this event.
-   *
-   * <p>For list operations within a namespace, the identifier is the 
identifier corresponds to that
-   * namespace. For metalake list operation, identifier is null.
-   *
-   * @return A NameIdentifier object that represents the resource, like a 
metalake, catalog, schema,
-   *     table, etc., associated with the event.
-   */
-  @Nullable
-  public NameIdentifier identifier() {
-    return identifier;
-  }
-
-  /**
-   * Returns the timestamp when the event was created.
-   *
-   * @return The event creation time in milliseconds since epoch.
-   */
-  public long eventTime() {
-    return eventTime;
+    super(user, identifier);
   }
 }
diff --git 
a/core/src/main/java/org/apache/gravitino/listener/api/event/PreEvent.java 
b/core/src/main/java/org/apache/gravitino/listener/api/event/PreEvent.java
new file mode 100644
index 000000000..52e26aec3
--- /dev/null
+++ b/core/src/main/java/org/apache/gravitino/listener/api/event/PreEvent.java
@@ -0,0 +1,31 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.gravitino.listener.api.event;
+
+import org.apache.gravitino.NameIdentifier;
+import org.apache.gravitino.annotation.DeveloperApi;
+
+/** Represents a pre event. */
+@DeveloperApi
+public abstract class PreEvent extends BaseEvent {
+  protected PreEvent(String user, NameIdentifier identifier) {
+    super(user, identifier);
+  }
+}
diff --git 
a/core/src/test/java/org/apache/gravitino/listener/DummyEventListener.java 
b/core/src/test/java/org/apache/gravitino/listener/DummyEventListener.java
index 17e3e4249..4ec7ab715 100644
--- a/core/src/test/java/org/apache/gravitino/listener/DummyEventListener.java
+++ b/core/src/test/java/org/apache/gravitino/listener/DummyEventListener.java
@@ -24,14 +24,17 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 import lombok.Getter;
+import org.apache.gravitino.exceptions.ForbiddenException;
 import org.apache.gravitino.listener.api.EventListenerPlugin;
 import org.apache.gravitino.listener.api.event.Event;
+import org.apache.gravitino.listener.api.event.PreEvent;
 import org.awaitility.Awaitility;
 import org.junit.jupiter.api.Assertions;
 
 public class DummyEventListener implements EventListenerPlugin {
   Map<String, String> properties;
-  @Getter LinkedList<Event> events = new LinkedList<>();
+  @Getter LinkedList<Event> postEvents = new LinkedList<>();
+  @Getter LinkedList<PreEvent> preEvents = new LinkedList<>();
 
   @Override
   public void init(Map<String, String> properties) {
@@ -46,7 +49,17 @@ public class DummyEventListener implements 
EventListenerPlugin {
 
   @Override
   public void onPostEvent(Event event) {
-    this.events.add(event);
+    postEvents.add(event);
+  }
+
+  @Override
+  public void onPreEvent(PreEvent preEvent) {
+    if 
(preEvent.equals(TestEventListenerManager.DUMMY_FORBIDDEN_PRE_EVENT_INSTANCE)) {
+      throw new ForbiddenException("");
+    } else if 
(preEvent.equals(TestEventListenerManager.DUMMY_EXCEPTION_PRE_EVENT_INSTANCE)) {
+      throw new RuntimeException("");
+    }
+    preEvents.add(preEvent);
   }
 
   @Override
@@ -54,18 +67,26 @@ public class DummyEventListener implements 
EventListenerPlugin {
     return Mode.SYNC;
   }
 
-  public Event popEvent() {
-    Assertions.assertTrue(events.size() > 0, "No events to pop");
-    return events.removeLast();
+  public Event popPostEvent() {
+    Assertions.assertTrue(postEvents.size() > 0, "No events to pop");
+    return postEvents.removeLast();
   }
 
   public static class DummyAsyncEventListener extends DummyEventListener {
-    public List<Event> tryGetEvents() {
+    public List<Event> tryGetPostEvents() {
+      Awaitility.await()
+          .atMost(20, TimeUnit.SECONDS)
+          .pollInterval(10, TimeUnit.MILLISECONDS)
+          .until(() -> getPostEvents().size() > 0);
+      return getPostEvents();
+    }
+
+    public List<PreEvent> tryGetPreEvents() {
       Awaitility.await()
           .atMost(20, TimeUnit.SECONDS)
           .pollInterval(10, TimeUnit.MILLISECONDS)
-          .until(() -> getEvents().size() > 0);
-      return getEvents();
+          .until(() -> getPreEvents().size() > 0);
+      return getPreEvents();
     }
 
     @Override
diff --git 
a/core/src/test/java/org/apache/gravitino/listener/TestEventListenerManager.java
 
b/core/src/test/java/org/apache/gravitino/listener/TestEventListenerManager.java
index d0dda8878..fd7a61272 100644
--- 
a/core/src/test/java/org/apache/gravitino/listener/TestEventListenerManager.java
+++ 
b/core/src/test/java/org/apache/gravitino/listener/TestEventListenerManager.java
@@ -26,22 +26,42 @@ import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 import org.apache.gravitino.NameIdentifier;
+import org.apache.gravitino.exceptions.ForbiddenException;
 import 
org.apache.gravitino.listener.DummyEventListener.DummyAsyncEventListener;
 import 
org.apache.gravitino.listener.DummyEventListener.DummyAsyncIsolatedEventListener;
 import org.apache.gravitino.listener.api.EventListenerPlugin;
 import org.apache.gravitino.listener.api.event.Event;
+import org.apache.gravitino.listener.api.event.PreEvent;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 public class TestEventListenerManager {
-  static class DummyEvent extends Event {
-    protected DummyEvent(String user, NameIdentifier identifier) {
+
+  static class DummyPostEvent extends Event {
+
+    protected DummyPostEvent(String user, NameIdentifier identifier) {
       super(user, identifier);
     }
   }
 
-  private static final DummyEvent DUMMY_EVENT_INSTANCE =
-      new DummyEvent("user", NameIdentifier.of("a", "b"));
+  static class DummyPreEvent extends PreEvent {
+
+    protected DummyPreEvent(String user, NameIdentifier identifier) {
+      super(user, identifier);
+    }
+  }
+
+  private static final DummyPostEvent DUMMY_POST_EVENT_INSTANCE =
+      new DummyPostEvent("user", NameIdentifier.of("a", "b"));
+
+  private static final DummyPreEvent DUMMY_PRE_EVENT_INSTANCE =
+      new DummyPreEvent("user2", NameIdentifier.of("a2", "b2"));
+
+  public static final DummyPreEvent DUMMY_FORBIDDEN_PRE_EVENT_INSTANCE =
+      new DummyPreEvent("user3", NameIdentifier.of("a3", "b3"));
+
+  public static final DummyPreEvent DUMMY_EXCEPTION_PRE_EVENT_INSTANCE =
+      new DummyPreEvent("user4", NameIdentifier.of("a4", "b4"));
 
   @Test
   void testSyncListener() {
@@ -54,9 +74,10 @@ public class TestEventListenerManager {
     eventListenerManager.start();
 
     EventBus eventBus = eventListenerManager.createEventBus();
-    eventBus.dispatchEvent(DUMMY_EVENT_INSTANCE);
 
-    List<EventListenerPlugin> listeners = eventBus.getPostEventListeners();
+    // test post event
+    eventBus.dispatchEvent(DUMMY_POST_EVENT_INSTANCE);
+    List<EventListenerPlugin> listeners = eventBus.getEventListeners();
     Assertions.assertEquals(2, listeners.size());
     Set<String> names =
         listeners.stream()
@@ -66,7 +87,27 @@ public class TestEventListenerManager {
                   EventListenerPluginWrapper wrapper = 
(EventListenerPluginWrapper) listener;
                   EventListenerPlugin userListener = 
wrapper.getUserEventListener();
                   Assertions.assertTrue(userListener instanceof 
DummyEventListener);
-                  checkEvents(((DummyEventListener) userListener).getEvents());
+                  checkPostEvents(((DummyEventListener) 
userListener).getPostEvents());
+                  Assertions.assertEquals(
+                      0, ((DummyEventListener) 
userListener).getPreEvents().size());
+                  return ((DummyEventListener) 
userListener).properties.get("name");
+                })
+            .collect(Collectors.toSet());
+    Assertions.assertEquals(ImmutableSet.of(sync1, sync2), names);
+
+    // test pre event
+    eventBus.dispatchEvent(DUMMY_PRE_EVENT_INSTANCE);
+    names =
+        listeners.stream()
+            .map(
+                listener -> {
+                  Assertions.assertTrue(listener instanceof 
EventListenerPluginWrapper);
+                  EventListenerPluginWrapper wrapper = 
(EventListenerPluginWrapper) listener;
+                  EventListenerPlugin userListener = 
wrapper.getUserEventListener();
+                  Assertions.assertTrue(userListener instanceof 
DummyEventListener);
+                  checkPreEvents(((DummyEventListener) 
userListener).getPreEvents());
+                  Assertions.assertEquals(
+                      0, ((DummyEventListener) 
userListener).getPostEvents().size());
                   return ((DummyEventListener) 
userListener).properties.get("name");
                 })
             .collect(Collectors.toSet());
@@ -84,10 +125,11 @@ public class TestEventListenerManager {
     EventListenerManager eventListenerManager = new EventListenerManager();
     eventListenerManager.init(properties);
     eventListenerManager.start();
-
     EventBus eventBus = eventListenerManager.createEventBus();
-    eventBus.dispatchEvent(DUMMY_EVENT_INSTANCE);
-    List<EventListenerPlugin> listeners = eventBus.getPostEventListeners();
+
+    // Test post event
+    eventBus.dispatchEvent(DUMMY_POST_EVENT_INSTANCE);
+    List<EventListenerPlugin> listeners = eventBus.getEventListeners();
 
     Assertions.assertEquals(1, listeners.size());
     Assertions.assertTrue(listeners.get(0) instanceof AsyncQueueListener);
@@ -102,12 +144,27 @@ public class TestEventListenerManager {
                   EventListenerPlugin userListener =
                       ((EventListenerPluginWrapper) 
shareQueueListener).getUserEventListener();
                   Assertions.assertTrue(userListener instanceof 
DummyAsyncEventListener);
-                  checkEvents(((DummyAsyncEventListener) 
userListener).tryGetEvents());
+                  checkPostEvents(((DummyAsyncEventListener) 
userListener).tryGetPostEvents());
+                  Assertions.assertEquals(
+                      0, ((DummyAsyncEventListener) 
userListener).getPreEvents().size());
                   return ((DummyAsyncEventListener) 
userListener).properties.get("name");
                 })
             .collect(Collectors.toSet());
     Assertions.assertEquals(ImmutableSet.of(async1, async2), 
sharedQueueListenerNames);
 
+    // Test pre event
+    eventBus.dispatchEvent(DUMMY_PRE_EVENT_INSTANCE);
+    shareQueueListeners.forEach(
+        shareQueueListener -> {
+          Assertions.assertTrue(shareQueueListener instanceof 
EventListenerPluginWrapper);
+          EventListenerPlugin userListener =
+              ((EventListenerPluginWrapper) 
shareQueueListener).getUserEventListener();
+          Assertions.assertTrue(userListener instanceof 
DummyAsyncEventListener);
+          checkPreEvents(((DummyAsyncEventListener) 
userListener).tryGetPreEvents());
+          Assertions.assertEquals(
+              0, ((DummyAsyncEventListener) 
userListener).getPostEvents().size());
+        });
+
     eventListenerManager.stop();
   }
 
@@ -122,8 +179,8 @@ public class TestEventListenerManager {
     eventListenerManager.start();
 
     EventBus eventBus = eventListenerManager.createEventBus();
-    eventBus.dispatchEvent(DUMMY_EVENT_INSTANCE);
-    List<EventListenerPlugin> listeners = eventBus.getPostEventListeners();
+    eventBus.dispatchEvent(DUMMY_POST_EVENT_INSTANCE);
+    List<EventListenerPlugin> listeners = eventBus.getEventListeners();
 
     Assertions.assertEquals(2, listeners.size());
     Set<String> isolatedListenerNames =
@@ -141,12 +198,49 @@ public class TestEventListenerManager {
                       ((EventListenerPluginWrapper) internalListeners.get(0))
                           .getUserEventListener();
                   Assertions.assertTrue(userListener instanceof 
DummyAsyncEventListener);
-                  checkEvents(((DummyAsyncEventListener) 
userListener).tryGetEvents());
+                  checkPostEvents(((DummyAsyncEventListener) 
userListener).tryGetPostEvents());
+                  Assertions.assertEquals(
+                      0, ((DummyAsyncEventListener) 
userListener).getPreEvents().size());
                   return ((DummyAsyncEventListener) 
userListener).properties.get("name");
                 })
             .collect(Collectors.toSet());
     Assertions.assertEquals(ImmutableSet.of(async1, async2), 
isolatedListenerNames);
 
+    eventBus.dispatchEvent(DUMMY_PRE_EVENT_INSTANCE);
+    listeners.forEach(
+        listener -> {
+          Assertions.assertTrue(listener instanceof AsyncQueueListener);
+          AsyncQueueListener asyncQueueListener = (AsyncQueueListener) 
listener;
+          List<EventListenerPlugin> internalListeners = 
asyncQueueListener.getEventListeners();
+          Assertions.assertEquals(1, internalListeners.size());
+          Assertions.assertTrue(internalListeners.get(0) instanceof 
EventListenerPluginWrapper);
+          EventListenerPlugin userListener =
+              ((EventListenerPluginWrapper) 
internalListeners.get(0)).getUserEventListener();
+          Assertions.assertTrue(userListener instanceof 
DummyAsyncEventListener);
+          checkPreEvents(((DummyAsyncEventListener) 
userListener).tryGetPreEvents());
+          Assertions.assertEquals(
+              0, ((DummyAsyncEventListener) 
userListener).getPostEvents().size());
+        });
+
+    eventListenerManager.stop();
+  }
+
+  @Test
+  void testForbiddenPreEvent() {
+    String sync1 = "sync1";
+    String sync2 = "sync2";
+    Map<String, String> properties = createSyncEventListenerConfig(sync1, 
sync2);
+
+    EventListenerManager eventListenerManager = new EventListenerManager();
+    eventListenerManager.init(properties);
+    eventListenerManager.start();
+
+    EventBus eventBus = eventListenerManager.createEventBus();
+
+    Assertions.assertThrowsExactly(
+        ForbiddenException.class, () -> 
eventBus.dispatchEvent(DUMMY_FORBIDDEN_PRE_EVENT_INSTANCE));
+
+    Assertions.assertDoesNotThrow(() -> 
eventBus.dispatchEvent(DUMMY_EXCEPTION_PRE_EVENT_INSTANCE));
     eventListenerManager.stop();
   }
 
@@ -206,8 +300,15 @@ public class TestEventListenerManager {
     return config;
   }
 
-  private void checkEvents(List<Event> events) {
+  private void checkPostEvents(List<Event> events) {
+    Assertions.assertEquals(1, events.size());
+    Assertions.assertEquals(DUMMY_POST_EVENT_INSTANCE, events.get(0));
+    events.clear();
+  }
+
+  private void checkPreEvents(List<PreEvent> events) {
     Assertions.assertEquals(1, events.size());
-    Assertions.assertEquals(DUMMY_EVENT_INSTANCE, events.get(0));
+    Assertions.assertEquals(DUMMY_PRE_EVENT_INSTANCE, events.get(0));
+    events.clear();
   }
 }
diff --git 
a/core/src/test/java/org/apache/gravitino/listener/api/event/TestCatalogEvent.java
 
b/core/src/test/java/org/apache/gravitino/listener/api/event/TestCatalogEvent.java
index ae5407329..d20508943 100644
--- 
a/core/src/test/java/org/apache/gravitino/listener/api/event/TestCatalogEvent.java
+++ 
b/core/src/test/java/org/apache/gravitino/listener/api/event/TestCatalogEvent.java
@@ -65,7 +65,7 @@ public class TestCatalogEvent {
     NameIdentifier identifier = NameIdentifier.of("metalake", catalog.name());
     dispatcher.createCatalog(
         identifier, catalog.type(), catalog.provider(), catalog.comment(), 
catalog.properties());
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(CreateCatalogEvent.class, event.getClass());
     CatalogInfo catalogInfo = ((CreateCatalogEvent) 
event).createdCatalogInfo();
@@ -76,7 +76,7 @@ public class TestCatalogEvent {
   void testLoadCatalogEvent() {
     NameIdentifier identifier = NameIdentifier.of("metalake", catalog.name());
     dispatcher.loadCatalog(identifier);
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(LoadCatalogEvent.class, event.getClass());
     CatalogInfo catalogInfo = ((LoadCatalogEvent) event).loadedCatalogInfo();
@@ -88,7 +88,7 @@ public class TestCatalogEvent {
     NameIdentifier identifier = NameIdentifier.of("metalake", catalog.name());
     CatalogChange catalogChange = CatalogChange.setProperty("a", "b");
     dispatcher.alterCatalog(identifier, catalogChange);
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(AlterCatalogEvent.class, event.getClass());
     CatalogInfo catalogInfo = ((AlterCatalogEvent) event).updatedCatalogInfo();
@@ -102,7 +102,7 @@ public class TestCatalogEvent {
   void testDropCatalogEvent() {
     NameIdentifier identifier = NameIdentifier.of("metalake", catalog.name());
     dispatcher.dropCatalog(identifier);
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(DropCatalogEvent.class, event.getClass());
     Assertions.assertEquals(true, ((DropCatalogEvent) event).isExists());
@@ -112,7 +112,7 @@ public class TestCatalogEvent {
   void testListCatalogEvent() {
     Namespace namespace = Namespace.of("metalake");
     dispatcher.listCatalogs(namespace);
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(namespace.toString(), 
event.identifier().toString());
     Assertions.assertEquals(ListCatalogEvent.class, event.getClass());
     Assertions.assertEquals(namespace, ((ListCatalogEvent) event).namespace());
@@ -122,7 +122,7 @@ public class TestCatalogEvent {
   void testListCatalogInfoEvent() {
     Namespace namespace = Namespace.of("metalake");
     dispatcher.listCatalogsInfo(namespace);
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(namespace.toString(), 
event.identifier().toString());
     Assertions.assertEquals(ListCatalogEvent.class, event.getClass());
     Assertions.assertEquals(namespace, ((ListCatalogEvent) event).namespace());
@@ -140,7 +140,7 @@ public class TestCatalogEvent {
                 catalog.provider(),
                 catalog.comment(),
                 catalog.properties()));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(CreateCatalogFailureEvent.class, event.getClass());
     Assertions.assertEquals(
@@ -154,7 +154,7 @@ public class TestCatalogEvent {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog");
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class, () -> 
failureDispatcher.loadCatalog(identifier));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(LoadCatalogFailureEvent.class, event.getClass());
     Assertions.assertEquals(
@@ -168,7 +168,7 @@ public class TestCatalogEvent {
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class,
         () -> failureDispatcher.alterCatalog(identifier, catalogChange));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(AlterCatalogFailureEvent.class, event.getClass());
     Assertions.assertEquals(
@@ -183,7 +183,7 @@ public class TestCatalogEvent {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog");
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class, () -> 
failureDispatcher.dropCatalog(identifier));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(DropCatalogFailureEvent.class, event.getClass());
     Assertions.assertEquals(
@@ -195,7 +195,7 @@ public class TestCatalogEvent {
     Namespace namespace = Namespace.of("metalake", "catalog");
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class, () -> 
failureDispatcher.listCatalogs(namespace));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(ListCatalogFailureEvent.class, event.getClass());
     Assertions.assertEquals(
         GravitinoRuntimeException.class, ((ListCatalogFailureEvent) 
event).exception().getClass());
@@ -207,7 +207,7 @@ public class TestCatalogEvent {
     Namespace namespace = Namespace.of("metalake", "catalog");
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class, () -> 
failureDispatcher.listCatalogsInfo(namespace));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(ListCatalogFailureEvent.class, event.getClass());
     Assertions.assertEquals(
         GravitinoRuntimeException.class, ((ListCatalogFailureEvent) 
event).exception().getClass());
diff --git 
a/core/src/test/java/org/apache/gravitino/listener/api/event/TestFilesetEvent.java
 
b/core/src/test/java/org/apache/gravitino/listener/api/event/TestFilesetEvent.java
index efc073b19..321088711 100644
--- 
a/core/src/test/java/org/apache/gravitino/listener/api/event/TestFilesetEvent.java
+++ 
b/core/src/test/java/org/apache/gravitino/listener/api/event/TestFilesetEvent.java
@@ -75,7 +75,7 @@ public class TestFilesetEvent {
         fileset.type(),
         fileset.storageLocation(),
         fileset.properties());
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(CreateFilesetEvent.class, event.getClass());
     FilesetInfo filesetInfo = ((CreateFilesetEvent) 
event).createdFilesetInfo();
@@ -86,7 +86,7 @@ public class TestFilesetEvent {
   void testLoadFilesetEvent() {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
fileset.name());
     dispatcher.loadFileset(identifier);
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(LoadFilesetEvent.class, event.getClass());
     FilesetInfo filesetInfo = ((LoadFilesetEvent) event).loadedFilesetInfo();
@@ -98,7 +98,7 @@ public class TestFilesetEvent {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
fileset.name());
     FilesetChange change = FilesetChange.setProperty("a", "b");
     dispatcher.alterFileset(identifier, change);
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(AlterFilesetEvent.class, event.getClass());
     FilesetInfo filesetInfo = ((AlterFilesetEvent) event).updatedFilesetInfo();
@@ -111,7 +111,7 @@ public class TestFilesetEvent {
   void testDropFilesetEvent() {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
fileset.name());
     dispatcher.dropFileset(identifier);
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(DropFilesetEvent.class, event.getClass());
     Assertions.assertTrue(((DropFilesetEvent) event).isExists());
@@ -121,7 +121,7 @@ public class TestFilesetEvent {
   void testListFilesetEvent() {
     Namespace namespace = Namespace.of("metalake", "catalog");
     dispatcher.listFilesets(namespace);
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(namespace.toString(), 
event.identifier().toString());
     Assertions.assertEquals(ListFilesetEvent.class, event.getClass());
     Assertions.assertEquals(namespace, ((ListFilesetEvent) event).namespace());
@@ -136,7 +136,7 @@ public class TestFilesetEvent {
         fileset.type(),
         fileset.storageLocation(),
         fileset.properties());
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(CreateFilesetEvent.class, event.getClass());
     FilesetInfo filesetInfo = ((CreateFilesetEvent) 
event).createdFilesetInfo();
@@ -152,7 +152,7 @@ public class TestFilesetEvent {
     CallerContext callerContext = 
CallerContext.builder().withContext(contextMap).build();
     CallerContext.CallerContextHolder.set(callerContext);
     String fileLocation = dispatcher.getFileLocation(identifier, "test");
-    Event event1 = dummyEventListener.popEvent();
+    Event event1 = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event1.identifier());
     Assertions.assertEquals(GetFileLocationEvent.class, event1.getClass());
     String actualFileLocation = ((GetFileLocationEvent) 
event1).actualFileLocation();
@@ -180,7 +180,7 @@ public class TestFilesetEvent {
                 fileset.type(),
                 fileset.storageLocation(),
                 fileset.properties()));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(CreateFilesetFailureEvent.class, event.getClass());
     Assertions.assertEquals(
@@ -194,7 +194,7 @@ public class TestFilesetEvent {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
"fileset");
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class, () -> 
failureDispatcher.loadFileset(identifier));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(LoadFilesetFailureEvent.class, event.getClass());
     Assertions.assertEquals(
@@ -207,7 +207,7 @@ public class TestFilesetEvent {
     FilesetChange change = FilesetChange.setProperty("a", "b");
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class, () -> 
failureDispatcher.alterFileset(identifier, change));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(AlterFilesetFailureEvent.class, event.getClass());
     Assertions.assertEquals(
@@ -221,7 +221,7 @@ public class TestFilesetEvent {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
"fileset");
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class, () -> 
failureDispatcher.dropFileset(identifier));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(DropFilesetFailureEvent.class, event.getClass());
     Assertions.assertEquals(
@@ -233,7 +233,7 @@ public class TestFilesetEvent {
     Namespace namespace = Namespace.of("metalake", "catalog");
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class, () -> 
failureDispatcher.listFilesets(namespace));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(namespace.toString(), 
event.identifier().toString());
     Assertions.assertEquals(ListFilesetFailureEvent.class, event.getClass());
     Assertions.assertEquals(
@@ -247,7 +247,7 @@ public class TestFilesetEvent {
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class,
         () -> failureDispatcher.getFileLocation(identifier, "/test"));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(GetFileLocationFailureEvent.class, 
event.getClass());
     Assertions.assertEquals(
diff --git 
a/core/src/test/java/org/apache/gravitino/listener/api/event/TestMetalakeEvent.java
 
b/core/src/test/java/org/apache/gravitino/listener/api/event/TestMetalakeEvent.java
index a31ce9338..319ac641f 100644
--- 
a/core/src/test/java/org/apache/gravitino/listener/api/event/TestMetalakeEvent.java
+++ 
b/core/src/test/java/org/apache/gravitino/listener/api/event/TestMetalakeEvent.java
@@ -63,7 +63,7 @@ public class TestMetalakeEvent {
   void testCreateMetalakeEvent() {
     NameIdentifier identifier = NameIdentifier.of("metalake");
     dispatcher.createMetalake(identifier, metalake.comment(), 
metalake.properties());
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(CreateMetalakeEvent.class, event.getClass());
     MetalakeInfo metalakeInfo = ((CreateMetalakeEvent) 
event).createdMetalakeInfo();
@@ -74,7 +74,7 @@ public class TestMetalakeEvent {
   void testLoadMetalakeEvent() {
     NameIdentifier identifier = NameIdentifier.of("metalake");
     dispatcher.loadMetalake(identifier);
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(LoadMetalakeEvent.class, event.getClass());
     MetalakeInfo metalakeInfo = ((LoadMetalakeEvent) 
event).loadedMetalakeInfo();
@@ -86,7 +86,7 @@ public class TestMetalakeEvent {
     NameIdentifier identifier = NameIdentifier.of("metalake");
     MetalakeChange metalakeChange = MetalakeChange.setProperty("a", "b");
     dispatcher.alterMetalake(identifier, metalakeChange);
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(AlterMetalakeEvent.class, event.getClass());
     MetalakeInfo metalakeInfo = ((AlterMetalakeEvent) 
event).updatedMetalakeInfo();
@@ -100,7 +100,7 @@ public class TestMetalakeEvent {
   void testDropMetalakeEvent() {
     NameIdentifier identifier = NameIdentifier.of("metalake");
     dispatcher.dropMetalake(identifier);
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(DropMetalakeEvent.class, event.getClass());
     Assertions.assertTrue(((DropMetalakeEvent) event).isExists());
@@ -109,7 +109,7 @@ public class TestMetalakeEvent {
   @Test
   void testListMetalakeEvent() {
     dispatcher.listMetalakes();
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertNull(event.identifier());
     Assertions.assertEquals(ListMetalakeEvent.class, event.getClass());
   }
@@ -122,7 +122,7 @@ public class TestMetalakeEvent {
         () ->
             failureDispatcher.createMetalake(
                 identifier, metalake.comment(), metalake.properties()));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(CreateMetalakeFailureEvent.class, 
event.getClass());
     Assertions.assertEquals(
@@ -136,7 +136,7 @@ public class TestMetalakeEvent {
     NameIdentifier identifier = NameIdentifier.of(metalake.name());
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class, () -> 
failureDispatcher.loadMetalake(identifier));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(LoadMetalakeFailureEvent.class, event.getClass());
     Assertions.assertEquals(
@@ -150,7 +150,7 @@ public class TestMetalakeEvent {
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class,
         () -> failureDispatcher.alterMetalake(identifier, metalakeChange));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(AlterMetalakeFailureEvent.class, event.getClass());
     Assertions.assertEquals(
@@ -166,7 +166,7 @@ public class TestMetalakeEvent {
     NameIdentifier identifier = NameIdentifier.of(metalake.name());
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class, () -> 
failureDispatcher.dropMetalake(identifier));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(DropMetalakeFailureEvent.class, event.getClass());
     Assertions.assertEquals(
@@ -177,7 +177,7 @@ public class TestMetalakeEvent {
   void testListMetalakeFailureEvent() {
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class, () -> 
failureDispatcher.listMetalakes());
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertNull(event.identifier());
     Assertions.assertEquals(ListMetalakeFailureEvent.class, event.getClass());
     Assertions.assertEquals(
diff --git 
a/core/src/test/java/org/apache/gravitino/listener/api/event/TestPartitionEvent.java
 
b/core/src/test/java/org/apache/gravitino/listener/api/event/TestPartitionEvent.java
index 408330a40..a1aa8aab2 100644
--- 
a/core/src/test/java/org/apache/gravitino/listener/api/event/TestPartitionEvent.java
+++ 
b/core/src/test/java/org/apache/gravitino/listener/api/event/TestPartitionEvent.java
@@ -110,7 +110,7 @@ public class TestPartitionEvent {
   void testAddPartitionEvent() {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
"schema", "table");
     dispatcher.addPartition(identifier, partition);
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(AddPartitionEvent.class, event.getClass());
     PartitionInfo partitionInfo = ((AddPartitionEvent) 
event).createdPartitionInfo();
@@ -121,7 +121,7 @@ public class TestPartitionEvent {
   void testDropPartitionEvent() {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
"schema", "table");
     dispatcher.dropPartition(identifier, partition.name());
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(DropPartitionEvent.class, event.getClass());
     Assertions.assertEquals(false, ((DropPartitionEvent) event).isExists());
@@ -131,7 +131,7 @@ public class TestPartitionEvent {
   void testPartitionExistsEvent() {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
"schema", "table");
     dispatcher.partitionExists(identifier, partition.name());
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(PartitionExistsEvent.class, event.getClass());
     Assertions.assertEquals(false, ((PartitionExistsEvent) event).isExists());
@@ -141,7 +141,7 @@ public class TestPartitionEvent {
   void testListPartitionEvent() {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
"schema", "table");
     dispatcher.listPartitions(identifier);
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(ListPartitionEvent.class, event.getClass());
     Assertions.assertEquals(identifier, ((ListPartitionEvent) 
event).identifier());
@@ -151,7 +151,7 @@ public class TestPartitionEvent {
   void testListPartitionNamesEvent() {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
"schema", "table");
     dispatcher.listPartitionNames(identifier);
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(ListPartitionNamesEvent.class, event.getClass());
     Assertions.assertEquals(identifier, ((ListPartitionNamesEvent) 
event).identifier());
@@ -161,7 +161,7 @@ public class TestPartitionEvent {
   void testPurgePartitionEvent() {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
"schema", "table");
     dispatcher.purgePartition(identifier, partition.name());
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(PurgePartitionEvent.class, event.getClass());
     Assertions.assertEquals(identifier, ((PurgePartitionEvent) 
event).identifier());
@@ -173,7 +173,7 @@ public class TestPartitionEvent {
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class,
         () -> failureDispatcher.addPartition(identifier, partition));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(AddPartitionFailureEvent.class, event.getClass());
     Assertions.assertEquals(
         GravitinoRuntimeException.class, ((AddPartitionFailureEvent) 
event).exception().getClass());
@@ -187,7 +187,7 @@ public class TestPartitionEvent {
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class,
         () -> failureDispatcher.dropPartition(identifier, partition.name()));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(DropPartitionFailureEvent.class, event.getClass());
     Assertions.assertEquals(
         GravitinoRuntimeException.class,
@@ -201,7 +201,7 @@ public class TestPartitionEvent {
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class,
         () -> failureDispatcher.partitionExists(identifier, partition.name()));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(PartitionExistsFailureEvent.class, 
event.getClass());
     Assertions.assertEquals(
         GravitinoRuntimeException.class,
@@ -214,7 +214,7 @@ public class TestPartitionEvent {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
"schema", "table");
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class, () -> 
failureDispatcher.listPartitions(identifier));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(ListPartitionFailureEvent.class, event.getClass());
     Assertions.assertEquals(
         GravitinoRuntimeException.class,
@@ -227,7 +227,7 @@ public class TestPartitionEvent {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
"schema", "table");
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class, () -> 
failureDispatcher.listPartitionNames(identifier));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(ListPartitionNamesFailureEvent.class, 
event.getClass());
     Assertions.assertEquals(
         GravitinoRuntimeException.class,
@@ -241,7 +241,7 @@ public class TestPartitionEvent {
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class,
         () -> failureDispatcher.purgePartition(identifier, partition.name()));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(PurgePartitionFailureEvent.class, 
event.getClass());
     Assertions.assertEquals(
         GravitinoRuntimeException.class,
diff --git 
a/core/src/test/java/org/apache/gravitino/listener/api/event/TestSchemaEvent.java
 
b/core/src/test/java/org/apache/gravitino/listener/api/event/TestSchemaEvent.java
index d9af6a155..c2c0d7e44 100644
--- 
a/core/src/test/java/org/apache/gravitino/listener/api/event/TestSchemaEvent.java
+++ 
b/core/src/test/java/org/apache/gravitino/listener/api/event/TestSchemaEvent.java
@@ -66,7 +66,7 @@ public class TestSchemaEvent {
   void testCreateSchemaEvent() {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
"schema");
     dispatcher.createSchema(identifier, "", ImmutableMap.of());
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(CreateSchemaEvent.class, event.getClass());
     SchemaInfo schemaInfo = ((CreateSchemaEvent) event).createdSchemaInfo();
@@ -77,7 +77,7 @@ public class TestSchemaEvent {
   void testLoadSchemaEvent() {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
"schema");
     dispatcher.loadSchema(identifier);
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(LoadSchemaEvent.class, event.getClass());
     SchemaInfo schemaInfo = ((LoadSchemaEvent) event).loadedSchemaInfo();
@@ -88,7 +88,7 @@ public class TestSchemaEvent {
   void testListSchemaEvent() {
     Namespace namespace = Namespace.of("metalake", "catalog");
     dispatcher.listSchemas(namespace);
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(ListSchemaEvent.class, event.getClass());
     Assertions.assertEquals(namespace, ((ListSchemaEvent) event).namespace());
   }
@@ -98,7 +98,7 @@ public class TestSchemaEvent {
     SchemaChange schemaChange = SchemaChange.setProperty("a", "b");
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
"schema");
     dispatcher.alterSchema(identifier, schemaChange);
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
 
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(AlterSchemaEvent.class, event.getClass());
@@ -113,7 +113,7 @@ public class TestSchemaEvent {
   void testDropSchemaEvent() {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
"schema");
     dispatcher.dropSchema(identifier, true);
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(DropSchemaEvent.class, event.getClass());
     Assertions.assertEquals(true, ((DropSchemaEvent) event).cascade());
@@ -126,7 +126,7 @@ public class TestSchemaEvent {
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class,
         () -> failureDispatcher.createSchema(identifier, schema.comment(), 
schema.properties()));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(CreateSchemaFailureEvent.class, event.getClass());
     Assertions.assertEquals(
@@ -139,7 +139,7 @@ public class TestSchemaEvent {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
"schema");
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class, () -> 
failureDispatcher.loadSchema(identifier));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(LoadSchemaFailureEvent.class, event.getClass());
     Assertions.assertEquals(
@@ -154,7 +154,7 @@ public class TestSchemaEvent {
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class,
         () -> failureDispatcher.alterSchema(identifier, schemaChange));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(AlterSchemaFailureEvent.class, event.getClass());
     Assertions.assertEquals(
@@ -168,7 +168,7 @@ public class TestSchemaEvent {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
"schema");
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class, () -> 
failureDispatcher.dropSchema(identifier, true));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(DropSchemaFailureEvent.class, event.getClass());
     Assertions.assertEquals(
@@ -181,7 +181,7 @@ public class TestSchemaEvent {
     Namespace namespace = Namespace.of("metalake", "catalog");
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class, () -> 
failureDispatcher.listSchemas(namespace));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(namespace.toString(), 
event.identifier().toString());
     Assertions.assertEquals(ListSchemaFailureEvent.class, event.getClass());
     Assertions.assertEquals(
diff --git 
a/core/src/test/java/org/apache/gravitino/listener/api/event/TestTableEvent.java
 
b/core/src/test/java/org/apache/gravitino/listener/api/event/TestTableEvent.java
index bf427f01f..11507c343 100644
--- 
a/core/src/test/java/org/apache/gravitino/listener/api/event/TestTableEvent.java
+++ 
b/core/src/test/java/org/apache/gravitino/listener/api/event/TestTableEvent.java
@@ -84,7 +84,7 @@ public class TestTableEvent {
         table.distribution(),
         table.sortOrder(),
         table.index());
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(CreateTableEvent.class, event.getClass());
     TableInfo tableInfo = ((CreateTableEvent) event).createdTableInfo();
@@ -95,7 +95,7 @@ public class TestTableEvent {
   void testLoadTableEvent() {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
table.name());
     dispatcher.loadTable(identifier);
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(LoadTableEvent.class, event.getClass());
     TableInfo tableInfo = ((LoadTableEvent) event).loadedTableInfo();
@@ -107,7 +107,7 @@ public class TestTableEvent {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
table.name());
     TableChange change = TableChange.setProperty("a", "b");
     dispatcher.alterTable(identifier, change);
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(AlterTableEvent.class, event.getClass());
     TableInfo tableInfo = ((AlterTableEvent) event).updatedTableInfo();
@@ -120,7 +120,7 @@ public class TestTableEvent {
   void testDropTableEvent() {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
table.name());
     dispatcher.dropTable(identifier);
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(DropTableEvent.class, event.getClass());
     Assertions.assertEquals(true, ((DropTableEvent) event).isExists());
@@ -130,7 +130,7 @@ public class TestTableEvent {
   void testPurgeTableEvent() {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
table.name());
     dispatcher.purgeTable(identifier);
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(PurgeTableEvent.class, event.getClass());
     Assertions.assertEquals(true, ((PurgeTableEvent) event).isExists());
@@ -140,7 +140,7 @@ public class TestTableEvent {
   void testListTableEvent() {
     Namespace namespace = Namespace.of("metalake", "catalog");
     dispatcher.listTables(namespace);
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(namespace.toString(), 
event.identifier().toString());
     Assertions.assertEquals(ListTableEvent.class, event.getClass());
     Assertions.assertEquals(namespace, ((ListTableEvent) event).namespace());
@@ -161,7 +161,7 @@ public class TestTableEvent {
                 table.distribution(),
                 table.sortOrder(),
                 table.index()));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(CreateTableFailureEvent.class, event.getClass());
     Assertions.assertEquals(
@@ -174,7 +174,7 @@ public class TestTableEvent {
     NameIdentifier identifier = NameIdentifier.of("metalake", "table", 
table.name());
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class, () -> 
failureDispatcher.loadTable(identifier));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(LoadTableFailureEvent.class, event.getClass());
     Assertions.assertEquals(
@@ -187,7 +187,7 @@ public class TestTableEvent {
     TableChange change = TableChange.setProperty("a", "b");
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class, () -> 
failureDispatcher.alterTable(identifier, change));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(AlterTableFailureEvent.class, event.getClass());
     Assertions.assertEquals(
@@ -201,7 +201,7 @@ public class TestTableEvent {
     NameIdentifier identifier = NameIdentifier.of("metalake", "table", 
table.name());
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class, () -> 
failureDispatcher.dropTable(identifier));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(DropTableFailureEvent.class, event.getClass());
     Assertions.assertEquals(
@@ -213,7 +213,7 @@ public class TestTableEvent {
     NameIdentifier identifier = NameIdentifier.of("metalake", "table", 
table.name());
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class, () -> 
failureDispatcher.purgeTable(identifier));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(PurgeTableFailureEvent.class, event.getClass());
     Assertions.assertEquals(
@@ -225,7 +225,7 @@ public class TestTableEvent {
     Namespace namespace = Namespace.of("metalake", "catalog");
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class, () -> 
failureDispatcher.listTables(namespace));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(namespace.toString(), 
event.identifier().toString());
     Assertions.assertEquals(ListTableFailureEvent.class, event.getClass());
     Assertions.assertEquals(
diff --git 
a/core/src/test/java/org/apache/gravitino/listener/api/event/TestTopicEvent.java
 
b/core/src/test/java/org/apache/gravitino/listener/api/event/TestTopicEvent.java
index cf6100648..268c628c5 100644
--- 
a/core/src/test/java/org/apache/gravitino/listener/api/event/TestTopicEvent.java
+++ 
b/core/src/test/java/org/apache/gravitino/listener/api/event/TestTopicEvent.java
@@ -65,7 +65,7 @@ public class TestTopicEvent {
   void testCreateTopicEvent() {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
"topic");
     dispatcher.createTopic(identifier, topic.comment(), null, 
topic.properties());
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(CreateTopicEvent.class, event.getClass());
     TopicInfo topicInfo = ((CreateTopicEvent) event).createdTopicInfo();
@@ -76,7 +76,7 @@ public class TestTopicEvent {
   void testLoadTopicEvent() {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
"topic");
     dispatcher.loadTopic(identifier);
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(LoadTopicEvent.class, event.getClass());
     TopicInfo topicInfo = ((LoadTopicEvent) event).loadedTopicInfo();
@@ -88,7 +88,7 @@ public class TestTopicEvent {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
"topic");
     TopicChange topicChange = TopicChange.setProperty("a", "b");
     dispatcher.alterTopic(identifier, topicChange);
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(AlterTopicEvent.class, event.getClass());
     TopicInfo topicInfo = ((AlterTopicEvent) event).updatedTopicInfo();
@@ -101,7 +101,7 @@ public class TestTopicEvent {
   void testDropTopicEvent() {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
"topic");
     dispatcher.dropTopic(identifier);
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(DropTopicEvent.class, event.getClass());
     Assertions.assertEquals(true, ((DropTopicEvent) event).isExists());
@@ -111,7 +111,7 @@ public class TestTopicEvent {
   void testListTopicEvent() {
     Namespace namespace = Namespace.of("metalake", "catalog");
     dispatcher.listTopics(namespace);
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(namespace.toString(), 
event.identifier().toString());
     Assertions.assertEquals(ListTopicEvent.class, event.getClass());
     Assertions.assertEquals(namespace, ((ListTopicEvent) event).namespace());
@@ -123,7 +123,7 @@ public class TestTopicEvent {
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class,
         () -> failureDispatcher.createTopic(identifier, topic.comment(), null, 
topic.properties()));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(CreateTopicFailureEvent.class, event.getClass());
     Assertions.assertEquals(
@@ -136,7 +136,7 @@ public class TestTopicEvent {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
"topic");
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class, () -> 
failureDispatcher.loadTopic(identifier));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(LoadTopicFailureEvent.class, event.getClass());
     Assertions.assertEquals(
@@ -150,7 +150,7 @@ public class TestTopicEvent {
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class,
         () -> failureDispatcher.alterTopic(identifier, topicChange));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(AlterTopicFailureEvent.class, event.getClass());
     Assertions.assertEquals(
@@ -164,7 +164,7 @@ public class TestTopicEvent {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
"topic");
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class, () -> 
failureDispatcher.dropTopic(identifier));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(DropTopicFailureEvent.class, event.getClass());
     Assertions.assertEquals(
@@ -176,7 +176,7 @@ public class TestTopicEvent {
     Namespace namespace = Namespace.of("metalake", "catalog");
     Assertions.assertThrowsExactly(
         GravitinoRuntimeException.class, () -> 
failureDispatcher.listTopics(namespace));
-    Event event = dummyEventListener.popEvent();
+    Event event = dummyEventListener.popPostEvent();
     Assertions.assertEquals(namespace.toString(), 
event.identifier().toString());
     Assertions.assertEquals(ListTopicFailureEvent.class, event.getClass());
     Assertions.assertEquals(

Reply via email to