RFR: JDK-8057556: JDP should better handle non-active interfaces

Dmitry Samersoff dmitry.samersoff at oracle.com
Thu Sep 4 16:14:17 UTC 2014


Looks good for me!

On 2014-09-04 19:59, Yasumasa Suenaga wrote:
> Hi all,
> 
> Thank you so much, Dmitry!
> 
> I've created webrev for it.
> http://cr.openjdk.java.net/~ysuenaga/JDK-8057556/webrev.0/
> 
> Please review.
> 
> 
> Thanks,
> 
> Yasumasa
> 
> 
> (2014/09/04 21:26), Dmitry Samersoff wrote:
>> 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.


More information about the serviceability-dev mailing list