This is an automated email from the ASF dual-hosted git repository. amichai pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/aries-rsa.git
commit 9f049b5a7db1a95d460babb917d252f929bbf220 Author: Amichai Rothman <[email protected]> AuthorDate: Mon Mar 16 22:03:42 2026 +0200 Remove unnecessary reverse map in ConfigDiscovery --- .../rsa/discovery/config/ConfigDiscovery.java | 52 +++++++--------------- 1 file changed, 15 insertions(+), 37 deletions(-) diff --git a/discovery/config/src/main/java/org/apache/aries/rsa/discovery/config/ConfigDiscovery.java b/discovery/config/src/main/java/org/apache/aries/rsa/discovery/config/ConfigDiscovery.java index 84cdfc40..a19f3db6 100644 --- a/discovery/config/src/main/java/org/apache/aries/rsa/discovery/config/ConfigDiscovery.java +++ b/discovery/config/src/main/java/org/apache/aries/rsa/discovery/config/ConfigDiscovery.java @@ -34,7 +34,6 @@ import java.util.concurrent.ConcurrentHashMap; class ConfigDiscovery implements ManagedServiceFactory { private final Map<EndpointDescription, String> endpointDescriptions = new ConcurrentHashMap<>(); private final Map<EndpointEventListener, Collection<String>> listenerToFilters = new HashMap<>(); - private final Map<String, Collection<EndpointEventListener>> filterToListeners = new HashMap<>(); @Override public String getName() { @@ -59,10 +58,6 @@ class ConfigDiscovery implements ManagedServiceFactory { synchronized (listenerToFilters) { listenerToFilters.put(endpointListener, filters); - for (String filter : filters) { - Collection<EndpointEventListener> listeners = filterToListeners.computeIfAbsent(filter, k -> new ArrayList<>()); - listeners.add(endpointListener); - } } triggerCallbacks(filters, endpointListener); @@ -70,35 +65,8 @@ class ConfigDiscovery implements ManagedServiceFactory { void removeListener(EndpointEventListener endpointListener) { synchronized (listenerToFilters) { - Collection<String> filters = listenerToFilters.remove(endpointListener); - if (filters == null) { - return; - } - - for (String filter : filters) { - Collection<EndpointEventListener> listeners = filterToListeners.get(filter); - if (listeners != null) { - listeners.remove(endpointListener); - if (listeners.isEmpty()) { - filterToListeners.remove(filter); - } - } - } - } - } - - private Map<String, Collection<EndpointEventListener>> getMatchingListeners(EndpointDescription endpoint) { - // return a copy of matched filters/listeners so that caller doesn't need to hold locks while triggering events - Map<String, Collection<EndpointEventListener>> matched = new HashMap<>(); - synchronized (listenerToFilters) { - for (Map.Entry<String, Collection<EndpointEventListener>> entry : filterToListeners.entrySet()) { - String filter = entry.getKey(); - if (matchFilter(filter, endpoint)) { - matched.put(filter, new ArrayList<>(entry.getValue())); - } - } + listenerToFilters.remove(endpointListener); } - return matched; } @SuppressWarnings("rawtypes") @@ -123,12 +91,22 @@ class ConfigDiscovery implements ManagedServiceFactory { private void triggerCallbacks(EndpointEvent event) { EndpointDescription endpoint = event.getEndpoint(); - for (Map.Entry<String, Collection<EndpointEventListener>> entry : getMatchingListeners(endpoint).entrySet()) { - String filter = entry.getKey(); - for (EndpointEventListener listener : entry.getValue()) { - triggerCallbacks(listener, filter, event); + // make a copy of matched filters/listeners so that caller doesn't need to hold locks while triggering events + List<Map.Entry<EndpointEventListener, String>> matched = new ArrayList<>(); + synchronized (listenerToFilters) { + for (Map.Entry<EndpointEventListener, Collection<String>> entry : listenerToFilters.entrySet()) { + EndpointEventListener listener = entry.getKey(); + for (String filter : entry.getValue()) { + if (matchFilter(filter, endpoint)) { + matched.add(Map.entry(listener, filter)); + } + } } } + // then trigger events without a lock + for (Map.Entry<EndpointEventListener, String> entry : matched) { + entry.getKey().endpointChanged(event, entry.getValue().toString()); + } } private void triggerCallbacks(EndpointEventListener endpointListener, String filter,
