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

ibessonov pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new 2706b6719e IGNITE-21198 Optimize memory usage in 
AbstractEventProducer#fireEvent (#3008)
2706b6719e is described below

commit 2706b6719e1212af3516c4cbe047791b5ef08e72
Author: Ivan Bessonov <bessonov...@gmail.com>
AuthorDate: Thu Jan 4 12:18:15 2024 +0300

    IGNITE-21198 Optimize memory usage in AbstractEventProducer#fireEvent 
(#3008)
---
 .../internal/event/AbstractEventProducer.java      | 28 +++++++++++++++-------
 1 file changed, 20 insertions(+), 8 deletions(-)

diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/event/AbstractEventProducer.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/event/AbstractEventProducer.java
index 155a7692dc..4a722e5dca 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/event/AbstractEventProducer.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/event/AbstractEventProducer.java
@@ -81,20 +81,32 @@ public abstract class AbstractEventProducer<T extends 
Event, P extends EventPara
             return nullCompletedFuture();
         }
 
-        CompletableFuture<?>[] futures = new 
CompletableFuture[listeners.size()];
+        // Lazy init.
+        List<CompletableFuture<?>> futures = null;
 
         for (int i = 0; i < listeners.size(); i++) {
             EventListener<P> listener = listeners.get(i);
 
-            futures[i] = listener.notify(params, err)
-                    .thenAccept(remove -> {
-                        if (remove) {
-                            removeListener(evt, listener);
-                        }
-                    });
+            CompletableFuture<Boolean> future = listener.notify(params, err);
+
+            if (future.isDone() && !future.isCompletedExceptionally()) {
+                if (future.join()) {
+                    removeListener(evt, listener);
+                }
+            } else {
+                if (futures == null) {
+                    futures = new ArrayList<>();
+                }
+
+                futures.add(future.thenAccept(remove -> {
+                    if (remove) {
+                        removeListener(evt, listener);
+                    }
+                }));
+            }
         }
 
-        return allOf(futures);
+        return futures == null ? nullCompletedFuture() : 
allOf(futures.toArray(CompletableFuture[]::new));
     }
 
     /**

Reply via email to