Code Review Request: 7044870: TEST_BUG: java/nio/channels/DatagramChannel/SelectWhenRefused.java failed on SUSE Linux 10

Kurchi Hazra kurchi.subhra.hazra at oracle.com
Tue Aug 23 11:38:11 PDT 2011


hg diff for the updated code:

-bash-3.00$ hg diff
diff --git 
a/test/java/nio/channels/DatagramChannel/SelectWhenRefused.java 
b/test/java/nio/channels/DatagramChannel/SelectWhenRefused.java
--- a/test/java/nio/channels/DatagramChannel/SelectWhenRefused.java
+++ b/test/java/nio/channels/DatagramChannel/SelectWhenRefused.java
@@ -34,17 +34,18 @@ import java.io.IOException;

  public class SelectWhenRefused {

-    public static void main(String[] args) throws IOException {
-        DatagramChannel dc = DatagramChannel.open().bind(new 
InetSocketAddress(0));
-        int port = dc.socket().getLocalPort();
-        dc.close();
+  public static void main(String[] args) throws IOException {
+     DatagramChannel dc1 = DatagramChannel.open().bind(new 
InetSocketAddress(0));
+     int port = dc1.socket().getLocalPort();
+     DatagramChannel dc = DatagramChannel.open().bind(new 
InetSocketAddress(0));
+     dc1.close();

-        // datagram sent to this address should be refused
-        SocketAddress refuser = new 
InetSocketAddress(InetAddress.getLocalHost(), port);
+     // datagram sent to this address should be refused

-        dc = DatagramChannel.open().bind(new InetSocketAddress(0));
-        Selector sel = Selector.open();
-        try {
+     SocketAddress refuser = new 
InetSocketAddress(InetAddress.getLocalHost(), port);
+     Selector sel = Selector.open();
+
+    try {
              dc.configureBlocking(false);
              dc.register(sel, SelectionKey.OP_READ);

@@ -52,12 +53,14 @@ public class SelectWhenRefused {
              sendDatagram(dc, refuser);
              int n = sel.select(2000);
              if (n > 0) {
+                sel.selectedKeys().clear();
+                DatagramSocket sock=new DatagramSocket(port);
+                sock.close();
                  throw new RuntimeException("Unexpected wakeup");
-            }
-
-            /* Test 2: connected so ICMP port unreachable may be 
received */
-            dc.connect(refuser);
-            try {
+                }
+                           /* Test 2: connected so ICMP port 
unreachable may be received */
+             try {
+                dc.connect(refuser);
                  sendDatagram(dc, refuser);
                  n = sel.select(2000);
                  if (n > 0) {
@@ -80,11 +83,18 @@ public class SelectWhenRefused {
                  throw new RuntimeException("Unexpected wakeup after 
disconnect");
              }

-        } finally {
+        }
+        catch (BindException e)
+        {
+                //Do nothing, someone else has bound to this port
+        }
+         finally {
              sel.close();
              dc.close();
          }
+
      }
+

      static void sendDatagram(DatagramChannel dc, SocketAddress remote)
          throws IOException


On 8/23/2011 11:04 AM, Kurchi Hazra wrote:
>
>
> On 8/23/2011 8:08 AM, Chris Hegarty wrote:
>> Hi Kurchi,
>>
>> I see your change is checking if another service is using the 
>> expected refuser port, and then ignoring any data since the test 
>> cannot be successfully run. I think this is good, but it may also be 
>> useful to defer closing of dc1 until after creation of dc. That way 
>> this issue shouldn't happen as often since dc will not reuse the 
>> refusers port. Make sense? Also, doesn't this impact on the rest of 
>> the test too?
>>
>> Would just catch BindException be sufficient? That's what you're 
>> expecting, right, "Address already in use"?
>
>
>
> - I agree, it should be a BindException that I catch. Also, I will 
> incorporate deferring of closing of dc1 until after dc is allocated a 
> port.
>
> -Kurchi
>
>
>>
>> -Chris.
>>
>> On 23/08/2011 01:29, Kurchi Hazra wrote:
>>> Hi,
>>>
>>>
>>> Test 1 in java/nio/channels/DatagramChannel/SelectWhenRefused.java was
>>> failing on some Linux kernels. This is because the test assumes that 
>>> the
>>> kernel will not bind a socket to a port that has been closed 
>>> immediately.
>>> However, some linux kernels (for example, 2.6.16.60-0.62.1-smp ) are
>>> precisely doing this and the test throws a RunTime Exception.
>>>
>>> The code has been changed to not to try binding the same socket that 
>>> has
>>> been immediately closed. In addition, we make sure that a port is not
>>> bound to a service already (in between the port being closed before and
>>> connected to later in the code) by checking before throwing the 
>>> Exception.
>>>
>>>
>>> Submitting hg diff since I do not have an openjdk account:
>>>
>>> -bash-3.00$ hg diff
>>> diff --git
>>> a/test/java/nio/channels/DatagramChannel/SelectWhenRefused.java
>>> b/test/java/nio/channels/DatagramChannel/SelectWhenRefused.java
>>> --- a/test/java/nio/channels/DatagramChannel/SelectWhenRefused.java
>>> +++ b/test/java/nio/channels/DatagramChannel/SelectWhenRefused.java
>>> @@ -35,14 +35,14 @@ public class SelectWhenRefused {
>>> public class SelectWhenRefused {
>>>
>>> public static void main(String[] args) throws IOException {
>>> - DatagramChannel dc = DatagramChannel.open().bind(new
>>> InetSocketAddress(0));
>>> - int port = dc.socket().getLocalPort();
>>> - dc.close();
>>> + DatagramChannel dc1 = DatagramChannel.open().bind(new
>>> InetSocketAddress(0));
>>> + int port = dc1.socket().getLocalPort();
>>> + dc1.close();
>>>
>>> // datagram sent to this address should be refused
>>> SocketAddress refuser = new
>>> InetSocketAddress(InetAddress.getLocalHost(), port);
>>>
>>> - dc = DatagramChannel.open().bind(new InetSocketAddress(0));
>>> + DatagramChannel dc = DatagramChannel.open().bind(new
>>> InetSocketAddress(0));
>>> Selector sel = Selector.open();
>>> try {
>>> dc.configureBlocking(false);
>>> @@ -52,7 +52,15 @@ public class SelectWhenRefused {
>>> sendDatagram(dc, refuser);
>>> int n = sel.select(2000);
>>> if (n > 0) {
>>> + try {
>>> + DatagramSocket dsBindCheck=new DatagramSocket(port);
>>> + dsBindCheck.close();
>>> throw new RuntimeException("Unexpected wakeup");
>>> + }
>>> + catch(SocketException e)
>>> + {
>>> + //Do nothing,some other test may have used the port
>>> + }
>>> }
>>>
>>> /* Test 2: connected so ICMP port unreachable may be received */
>>>
>>>
>>> Thanks,
>>>
>

-- 
-Kurchi



More information about the nio-dev mailing list