From a38fddc5c2a0fdfcde7bbd21b71cd407de21ee74 Mon Sep 17 00:00:00 2001 From: Pedro Ruivo Date: Fri, 26 Jan 2024 14:25:23 +0000 Subject: [PATCH] JGRP-2739 Cache addresses on first access --- src/org/jgroups/util/Util.java | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/org/jgroups/util/Util.java b/src/org/jgroups/util/Util.java index 402090d691..99cace74fd 100644 --- a/src/org/jgroups/util/Util.java +++ b/src/org/jgroups/util/Util.java @@ -4679,26 +4679,31 @@ public static void resetCacheAddresses(boolean reset_interfaces, boolean reset_a /** Returns all addresses of all interfaces (that are up) that satisfy a given filter (ignored if null) */ public static Collection getAllAvailableAddresses(Predicate filter) { - Collection cached_addresses=CACHED_ADDRESSES; - if(cached_addresses != null && filter == null) - return cached_addresses; - Set retval=new HashSet<>(); + Collection cached_addresses=getAllAvailableAddresses(); + assert cached_addresses != null; + return filter == null ? + cached_addresses : + cached_addresses.stream().filter(filter).collect(Collectors.toList()); + } + + private static synchronized Collection getAllAvailableAddresses() { + if (CACHED_ADDRESSES != null) { + return CACHED_ADDRESSES; + } + Set addresses = new HashSet<>(); try { List interfaces=getAllAvailableInterfaces(); for(NetworkInterface intf: interfaces) { if(!isUp(intf) /*!intf.isUp()*/) continue; - Enumeration addrs=intf.getInetAddresses(); - while(addrs.hasMoreElements()) { - InetAddress addr=addrs.nextElement(); - if(filter == null || filter.test(addr)) - retval.add(addr); - } + intf.getInetAddresses().asIterator().forEachRemaining(addresses::add); } } catch(SocketException e) { } - return CACHED_ADDRESSES=retval; + // immutable list + CACHED_ADDRESSES = List.copyOf(addresses); + return CACHED_ADDRESSES; } public static void checkIfValidAddress(InetAddress bind_addr,String prot_name) throws Exception {