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

amichair pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/aries-rsa.git

commit a3be8f906f3965edbd8af524168dde7d08df8242
Author: Amichai Rothman <[email protected]>
AuthorDate: Fri May 22 23:25:46 2026 +0300

    ARIES-2224 Fix ZooKeeper modified events published for unchanged endpoints
---
 .../zookeeper/client/ZookeeperEndpointListener.java | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git 
a/discovery/zookeeper/src/main/java/org/apache/aries/rsa/discovery/zookeeper/client/ZookeeperEndpointListener.java
 
b/discovery/zookeeper/src/main/java/org/apache/aries/rsa/discovery/zookeeper/client/ZookeeperEndpointListener.java
index beaab10d..f137112d 100644
--- 
a/discovery/zookeeper/src/main/java/org/apache/aries/rsa/discovery/zookeeper/client/ZookeeperEndpointListener.java
+++ 
b/discovery/zookeeper/src/main/java/org/apache/aries/rsa/discovery/zookeeper/client/ZookeeperEndpointListener.java
@@ -21,8 +21,11 @@ package org.apache.aries.rsa.discovery.zookeeper.client;
 import java.io.ByteArrayInputStream;
 import java.io.Closeable;
 import java.util.Collection;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Consumer;
 
@@ -113,6 +116,10 @@ public class ZookeeperEndpointListener implements 
Closeable {
 
     private void onChanged(String path, EndpointDescription endpoint) {
         EndpointDescription old = endpoints.put(path, endpoint);
+        if (old != null && getChangedProps(old.getProperties(), 
endpoint.getProperties()).isEmpty()) {
+            LOG.trace("ignoring endpoint that hasn't changed: {}", endpoint);
+            return;
+        }
         int type = old == null ? EndpointEvent.ADDED : EndpointEvent.MODIFIED;
         EndpointEvent event = new EndpointEvent(type, endpoint);
         listener.accept(event);
@@ -136,4 +143,18 @@ public class ZookeeperEndpointListener implements 
Closeable {
         }
     }
 
+    private static Set<String> getChangedProps(Map<String, Object> p1, 
Map<String, Object> p2) {
+        Set<String> changed = new LinkedHashSet<>();
+        for (Map.Entry<String, Object> entry : p1.entrySet()) {
+            Object v = p2.get(entry.getKey());
+            if (!Objects.deepEquals(entry.getValue(), v) || v == null && 
!p2.containsKey(entry.getKey()))
+                changed.add(entry.getKey());
+        }
+        for (String k : p2.keySet()) {
+            if (!p1.containsKey(k))
+                changed.add(k);
+        }
+        return changed;
+    }
+
 }

Reply via email to