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

Yasumasa Suenaga yasuenag at gmail.com
Tue Sep 9 03:45:24 UTC 2014


> 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