[prev in list] [next in list] [prev in thread] [next in thread] 

List:       jakarta-commons-dev
Subject:    [commons-jcs] 04/07: Fix UDP broadcasts
From:       tv () apache ! org
Date:       2021-03-30 19:04:11
Message-ID: 20210330190408.3812C8E94E () gitbox ! apache ! org
[Download RAW message or body]

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

tv pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-jcs.git

commit 0ff5e650201dd0edf8ad468bf7eb713e94c11d1a
Author: Thomas Vandahl <tv@apache.org>
AuthorDate: Tue Mar 30 20:30:50 2021 +0200

    Fix UDP broadcasts
---
 .../jcs3/utils/discovery/UDPDiscoverySender.java   |  2 +
 .../jcs3/utils/discovery/UDPDiscoveryService.java  | 60 +++++++++++++++++-----
 2 files changed, 49 insertions(+), 13 deletions(-)

diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs3/utils/discovery/UDPDiscoverySender.java \
b/commons-jcs-core/src/main/java/org/apache/commons/jcs3/utils/discovery/UDPDiscoverySender.java
 index 76d8c83..2375be1 100644
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs3/utils/discovery/UDPDiscoverySender.java
                
+++ b/commons-jcs-core/src/main/java/org/apache/commons/jcs3/utils/discovery/UDPDiscoverySender.java
 @@ -214,6 +214,8 @@ public class UDPDiscoverySender implements AutoCloseable
         log.debug( "sending requestBroadcast" );
 
         final UDPDiscoveryMessage message = new UDPDiscoveryMessage();
+        message.setHost(multicastAddress.getHostAddress());
+        message.setPort(multicastPort);
         message.setRequesterId( CacheInfo.listenerId );
         message.setMessageType( BroadcastType.REQUEST );
         send( message );
diff --git a/commons-jcs-core/src/main/java/org/apache/commons/jcs3/utils/discovery/UDPDiscoveryService.java \
b/commons-jcs-core/src/main/java/org/apache/commons/jcs3/utils/discovery/UDPDiscoveryService.java
 index 2a9fa56..0260b00 100644
--- a/commons-jcs-core/src/main/java/org/apache/commons/jcs3/utils/discovery/UDPDiscoveryService.java
                
+++ b/commons-jcs-core/src/main/java/org/apache/commons/jcs3/utils/discovery/UDPDiscoveryService.java
 @@ -20,12 +20,14 @@ package org.apache.commons.jcs3.utils.discovery;
  */
 
 import java.io.IOException;
+import java.net.Inet4Address;
 import java.net.Inet6Address;
 import java.net.InetAddress;
+import java.net.NetworkInterface;
 import java.net.UnknownHostException;
 import java.util.ArrayList;
+import java.util.Enumeration;
 import java.util.HashSet;
-import java.util.List;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
@@ -122,21 +124,55 @@ public class UDPDiscoveryService
             if (getUdpDiscoveryAttributes().getServiceAddress() == null ||
                     getUdpDiscoveryAttributes().getServiceAddress().isEmpty())
             {
+                // Use same interface as for multicast
+                NetworkInterface serviceInterface = null;
+                if (getUdpDiscoveryAttributes().getUdpDiscoveryInterface() != null)
+                {
+                    serviceInterface = NetworkInterface.getByName(
+                            getUdpDiscoveryAttributes().getUdpDiscoveryInterface());
+                }
+                else
+                {
+                    serviceInterface = HostNameUtil.getMulticastNetworkInterface();
+                }
+
                 try
                 {
-                    final List<InetAddress> addresses = \
                HostNameUtil.getLocalHostLANAddresses();
-                    final InetAddress serviceAddress;
+                    InetAddress serviceAddress = null;
 
-                    if (multicastAddress instanceof Inet6Address)
+                    for (Enumeration<InetAddress> addresses = \
serviceInterface.getInetAddresses(); +                            \
addresses.hasMoreElements();)  {
-                        // if Multicast uses IPv6, try to publish our IPv6 address
-                        serviceAddress = addresses.stream()
-                                .filter(address -> address instanceof Inet6Address)
-                                .findFirst().orElse(addresses.get(0));
+                        serviceAddress = addresses.nextElement();
+
+                        if (multicastAddress instanceof Inet6Address)
+                        {
+                            if (serviceAddress instanceof Inet6Address &&
+                                !serviceAddress.isLoopbackAddress() &&
+                                !serviceAddress.isMulticastAddress() &&
+                                serviceAddress.isLinkLocalAddress())
+                            {
+                                // if Multicast uses IPv6, try to publish our IPv6 \
address +                                break;
+                            }
+                        }
+                        else
+                        {
+                            if (serviceAddress instanceof Inet4Address &&
+                                !serviceAddress.isLoopbackAddress() &&
+                                !serviceAddress.isMulticastAddress() &&
+                                serviceAddress.isSiteLocalAddress())
+                            {
+                                // if Multicast uses IPv4, try to publish our IPv4 \
address +                                break;
+                            }
+                        }
                     }
-                    else
+
+                    if (serviceAddress == null)
                     {
-                        serviceAddress = addresses.get(0);
+                        // Nothing found for given interface, fall back
+                        serviceAddress = HostNameUtil.getLocalHostLANAddress();
                     }
 
                     \
getUdpDiscoveryAttributes().setServiceAddress(serviceAddress.getHostAddress()); @@ \
                -214,7 +250,7 @@ public class UDPDiscoveryService
      */
     public void initiateBroadcast()
     {
-        log.debug( "Creating sender thread for discoveryAddress = [{0}] and "
+        log.debug( "Creating sender for discoveryAddress = [{0}] and "
                 + "discoveryPort = [{1}] myHostName = [{2}] and port = [{3}]",
                 () -> getUdpDiscoveryAttributes().getUdpDiscoveryAddr(),
                 () -> getUdpDiscoveryAttributes().getUdpDiscoveryPort(),
@@ -414,12 +450,10 @@ public class UDPDiscoveryService
                 cleanupTaskFuture.cancel(false);
             }
 
-            // no good way to do this right now.
             if (receiver != null)
             {
                 log.info( "Shutting down UDP discovery service receiver." );
                 receiver.shutdown();
-                udpReceiverThread.interrupt();
             }
 
             log.info( "Shutting down UDP discovery service sender." );


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic