Please, file a separate issue.

--Dmitry



-----Original Message-----
From: Yasumasa Suenaga <yasue...@gmail.com>
To: Peter Allwin <peter.all...@oracle.com>
Cc: Dmitry Samersoff <dmitry.samers...@oracle.com>, 
"core-libs-dev@openjdk.java.net" <core-libs-dev@openjdk.java.net>, 
"serviceability-...@openjdk.java.net" <serviceability-...@openjdk.java.net>
Sent: Sat, 06 Sep 2014 19:37
Subject: Re: RFR: JDK-8057556: JDP should better handle non-active interfaces

Hi all,

My patch works fine in my environment, however, JMX agent will be terminated
silently when I run command as following:

java -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.source_addr=255.255.255.255 -version

Curently, sun.management.Agent#startDiscoveryService() throws 
AgentConfigurationError
when JdpException is occurred. However, argument of AgentConfiguratonError 
constructor
is incorrected. So NPE will be occurred. (I checked it with jdb.)

I think that we should fix it as following.

-----------
diff -r 68a6bb51cb26 src/java.management/share/classes/sun/management/Agent.java
--- a/src/java.management/share/classes/sun/management/Agent.java       Mon Sep 
01 13:33:28 2014 +0200
+++ b/src/java.management/share/classes/sun/management/Agent.java       Sat Sep 
06 23:50:58 2014 +0900
@@ -210,6 +210,8 @@
              } else {
                  throw new AgentConfigurationError(INVALID_JMXREMOTE_PORT, "No 
port specified");
              }
+        } catch (JdpException e) {
+            error(e);
          } catch (AgentConfigurationError err) {
              error(err.getError(), err.getParams());
          }
@@ -273,7 +275,7 @@
      }

      private static void startDiscoveryService(Properties props)
-            throws IOException {
+            throws IOException, JdpException {
          // Start discovery service if requested
          String discoveryPort = 
props.getProperty("com.sun.management.jdp.port");
          String discoveryAddress = 
props.getProperty("com.sun.management.jdp.address");
@@ -291,7 +293,7 @@
              try{
                 shouldStart = Boolean.parseBoolean(discoveryShouldStart);
              } catch (NumberFormatException e) {
-                throw new AgentConfigurationError("Couldn't parse 
autodiscovery argument");
+                throw new AgentConfigurationError(AGENT_EXCEPTION, "Couldn't 
parse autodiscovery argument");
              }
          }

@@ -302,7 +304,7 @@
                  address = (discoveryAddress == null) ?
                          InetAddress.getByName(JDP_DEFAULT_ADDRESS) : 
InetAddress.getByName(discoveryAddress);
              } catch (UnknownHostException e) {
-                throw new AgentConfigurationError("Unable to broadcast to 
requested address", e);
+                throw new AgentConfigurationError(AGENT_EXCEPTION, e, "Unable 
to broadcast to requested address");
              }

              int port = JDP_DEFAULT_PORT;
@@ -310,7 +312,7 @@
                 try {
                    port = Integer.parseInt(discoveryPort);
                 } catch (NumberFormatException e) {
-                 throw new AgentConfigurationError("Couldn't parse JDP port 
argument");
+                 throw new AgentConfigurationError(AGENT_EXCEPTION, "Couldn't 
parse JDP port argument");
                 }
              }

@@ -330,12 +332,7 @@

              String instanceName = 
props.getProperty("com.sun.management.jdp.name");

-            try{
-               JdpController.startDiscoveryService(address, port, 
instanceName, jmxUrlStr);
-            }
-            catch(JdpException e){
-                throw new AgentConfigurationError("Couldn't start JDP 
service", e);
-            }
+            JdpController.startDiscoveryService(address, port, instanceName, 
jmxUrlStr);
          }
      }

-----------


I want also to contribute it.
Should I merge it to JDK-8057556? Or should I file to JBS as new issue?


Thanks,

Yasumasa


(2014/09/05 19:28), 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?
>
>
> 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 <yasue...@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
>>>>> +++ 
>>>>> 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
>>>>
>>>>

Reply via email to