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