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

Yasumasa Suenaga yasuenag at gmail.com
Wed Sep 10 03:36:56 UTC 2014


Hi Dmitry,

Okay, I've uploaded new webrev for JDK-8057556:
http://cr.openjdk.java.net/~ysuenaga/JDK-8057556/webrev.2/

This change fixes a comment from Jarosalv as below:
>>>> L103 Please, move "else" to the previous line

Could you review it again?


Thanks,

Yasumasa


(2014/09/10 6:40), Dmitry Samersoff wrote:
> Yasumasa,
>
> To allow multiple application to use the same *multicast* address:port
> you probably just need to move
>
>   channel.setOption(StandardSocketOptions.SO_REUSEADDR, true);
>
> before bind.
>
>
> As for bind call lets leave this question out of scope of these two
> fixes. Different OS'es behave differently and I need to check it before
> we can go further. I'll come back later and file a separate CR if necessary.
>
> -Dmitry
>
> On 2014-09-09 07:45, Yasumasa Suenaga wrote:
>>> Bind call is required to listen on particular address. So please, keep
>>> it.
>>
>> I think JdpBroadcaster need not to call bind().
>> bind() binds address to application, so another application on same host
>> cannot use JDP.
>>
>> I've changed JdpBroadcaster as below:
>> -----------
>> 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 09 12:27:33 2014 +0900
>> @@ -79,11 +79,7 @@
>>           if (srcAddress != null) {
>>               // User requests particular interface to bind to
>>               NetworkInterface interf =
>> NetworkInterface.getByInetAddress(srcAddress);
>> -            try {
>> -                channel.bind(new InetSocketAddress(srcAddress, 0));
>> -            } catch (UnsupportedAddressTypeException ex) {
>> -                throw new JdpException("Unable to bind to source
>> address");
>> -            }
>> +            channel.setOption(StandardSocketOptions.SO_REUSEADDR, true);
>>               channel.setOption(StandardSocketOptions.IP_MULTICAST_IF,
>> interf);
>>           }
>>       }
>> -----------
>>
>> I ran two JVMs as below:
>> -----------
>> java -Dcom.sun.management.jmxremote.port=<port>
>> -Dcom.sun.management.jmxremote.authenticate=false
>>       -Dcom.sun.management.jmxremote.ssl=false
>> -Dcom.sun.management.jmxremote.autodiscovery=true
>>       -Dcom.sun.management.jdp.source_addr=<IP> <Long sleep application>
>> -----------
>>
>> Both JVM instances could send JDP packet.
>> I checked it with tcpdump and my JDP receiver application.
>>
>>
>> If you keep bind() call, JDP broadcaster only exists one instance
>> on same host.
>> I think JDP should be used by multiple JVM instance on same host.
>>
>>
>> Thanks,
>>
>> Yasumasa
>>
>>
>> (2014/09/09 0:48), Dmitry Samersoff wrote:
>>> Jaroslav,
>>>
>>>> L96-100 Do we still need these lines? Isn't
>>>> `channel.setOption(StandardSocketOptions.IP_MULTICAST_IF, interf);`
>>>> enough to listen on the interface?
>>>
>>> Bind call is required to listen on particular address. So please, keep
>>> it.
>>>
>>> -Dmitry
>>>
>>>
>>> On 2014-09-08 14:12, Jaroslav Bachorik wrote:
>>>> Hi Yasamusa,
>>>>
>>>> On 09/05/2014 12:28 PM, Yasumasa Suenaga wrote:
>>>>> Hi Peter,
>>>>>
>>>>> I fixed it and created new webrev.
>>>>> http://cr.openjdk.java.net/~ysuenaga/JDK-8057556/webrev.1/
>>>>>
>>>>> Could you review it again?
>>>>
>>>> Just a few nits ...
>>>>
>>>> L103 Please, move "else" to the previous line
>>>> L96-100 Do we still need these lines? Isn't
>>>> `channel.setOption(StandardSocketOptions.IP_MULTICAST_IF, interf);`
>>>> enough to listen on the interface?
>>>>
>>>> -JB-
>>>>
>>>>>
>>>>>
>>>>> Thanks,
>>>>>
>>>>> Yasumasa
>>>>>
>>>>>
>>>>> (2014/09/05 17:20), Peter Allwin wrote:
>>>>>> Looks like only the first Interface will be considered if no
>>>>>> srcAddress is provided (succeeded will be false and we will throw to
>>>>>> exit the while loop). Is this intended?
>>>>>>
>>>>>> Thanks!
>>>>>> /peter
>>>>>>
>>>>>>> On 4 sep 2014, at 17:59, Yasumasa Suenaga <yasuenag at gmail.com> 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
>>>>>>>>> +++что случилось с go contacts
>>>>>>>>> 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
>>>>>>>>
>>>>>>>>
>>>>
>>>
>>>
>
>


More information about the serviceability-dev mailing list