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 21:04:36 PDT 2011
Hi,
The updated code:
-bash-3.00$ hg diff
*** failed to import extension rebase: No module named rebase
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,15 @@ 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();
// 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));
+ dc1.close();
+
Selector sel = Selector.open();
try {
dc.configureBlocking(false);
@@ -52,6 +53,9 @@ 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");
}
@@ -80,7 +84,11 @@ public class SelectWhenRefused {
throw new RuntimeException("Unexpected wakeup after
disconnect");
}
- } finally {
+ } catch(BindException e) {
+
+ //Do nothing, some other test has used this port
+
+ } finally {
sel.close();
dc.close();
}
Thanks,
Kurchi
On 8/23/2011 1:36 PM, chris hegarty wrote:
> I'm not sure if it is the output of hg diff or your editor, but there
> appears to be stylistic issues.
>
> - removal of four space indentation of main method and several
> following declarations
> - open curly brace for finally/catch should be on same line
> - finally clause should start on the same line as the closing curly
> brace
>
> -Chris.
>
> There seems to be
>
> On 23/08/2011 19:38, Kurchi Hazra wrote:
>> 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/nio-dev/attachments/20110823/153dcd16/attachment-0001.html
More information about the nio-dev
mailing list