Yasumasa,

The CR number is JDK-8057556

I'll care about it's integration.

-Dmitry

On 2014-09-02 18:52, Yasumasa Suenaga wrote:
> Hi all,
> 
> I'm trying to use JDP on my Fedora20 machine.
> My machine has two NICs and only one NIC is up.
> 
> I passed system properties as below, however JDP broadcaster
> thread was not started:
> 
>   -Dcom.sun.management.jmxremote.port=7091
>   -Dcom.sun.management.jmxremote.authenticate=false
>   -Dcom.sun.management.jmxremote.ssl=false
>   -Dcom.sun.management.jmxremote.autodiscovery=true
>   -Dcom.sun.management.jdp.name=TEST
> 
> I checked exceptions with jdb, SocketException was occurred in
> JDPControllerRunner#run(), and it was caused by another NIC
> is down.
> 
> Currently, DiagramChannel which is used in JDPBroadcaster
> tries to send JDP packet through all "UP" NICs.
> However, NIC which is controlled by NetworkManager seems to
> be still "UP" when ifdown command is executed.
> (It seems to be removed IP address from NIC only.)
> 
> 
> This problem may be Fedora, however I think it should be
> improved in JDK.
> I've created a patch as below, and it works fine in my environment.
> (jdk9/dev/jdk)
> 
> If this patch may be accepted, I will file this to JBS.
> 
> --------------------
> diff -r 68a6bb51cb26 
> src/java.management/share/classes/sun/management/jdp/JdpBroadcaster.java
> --- 
> a/src/java.management/share/classes/sun/management/jdp/JdpBroadcaster.java    
>     Mon Sep 01 13:33:28 2014 +0200
> +++ 
> b/src/java.management/share/classes/sun/management/jdp/JdpBroadcaster.java    
>     Tue Sep 02 23:25:50 2014 +0900
> @@ -35,6 +35,7 @@
>  import java.nio.ByteBuffer;
>  import java.nio.channels.DatagramChannel;
>  import java.nio.channels.UnsupportedAddressTypeException;
> +import java.util.Enumeration;
>  
>  /**
>   * JdpBroadcaster is responsible for sending pre-built JDP packet across a 
> Net
> @@ -79,6 +80,15 @@
>          if (srcAddress != null) {
>              // User requests particular interface to bind to
>              NetworkInterface interf = 
> NetworkInterface.getByInetAddress(srcAddress);
> +
> +            if (interf == null) {
> +                throw new JdpException("Unable to get network interface for 
> " + srcAddress.toString());
> +            }
> +
> +            if (!interf.isUp() || !interf.supportsMulticast()) {
> +                throw new JdpException(interf.getName() + " does not support 
> multicast.");
> +            }
> +
>              try {
>                  channel.bind(new InetSocketAddress(srcAddress, 0));
>              } catch (UnsupportedAddressTypeException ex) {
> @@ -86,6 +96,23 @@
>              }
>              channel.setOption(StandardSocketOptions.IP_MULTICAST_IF, interf);
>          }
> +        else {
> +            Enumeration<NetworkInterface> nics = 
> NetworkInterface.getNetworkInterfaces();
> +            while (nics.hasMoreElements()) {
> +                NetworkInterface nic = nics.nextElement();
> +
> +                if (nic.isUp() && nic.supportsMulticast()) {
> +                    try {
> +                        
> channel.setOption(StandardSocketOptions.IP_MULTICAST_IF, nic);
> +                    } catch (IOException ex) {
> +                        System.err.println("WARNING: JDP broadcaster cannot 
> use " + nic.getName() + ": " + ex.getMessage());
> +                    }
> +                }
> +
> +            }
> +
> +        }
> +
>      }
>  
>      /**
> --------------------
> 
> 
> Thanks,
> 
> Yasumasa
> 


-- 
Dmitry Samersoff
Oracle Java development team, Saint Petersburg, Russia
* I would love to change the world, but they won't give me the sources.

Reply via email to