test/jdk/java/net/ServerSocket/AcceptCauseFileDescriptorLeak.java
changeset 57686 70f5cbb711a9
parent 55102 59567035d279
child 58679 9c3209ff7550
--- a/test/jdk/java/net/ServerSocket/AcceptCauseFileDescriptorLeak.java	Thu Aug 08 18:44:11 2019 +0100
+++ b/test/jdk/java/net/ServerSocket/AcceptCauseFileDescriptorLeak.java	Thu Aug 08 21:58:11 2019 +0100
@@ -26,8 +26,11 @@
  *
  * @test
  * @bug 6368984
+ * @key intermittent
  * @summary Configuring unconnected Socket before passing to implAccept
- *          can cause fd leak
+ *          can cause fd leak.
+ *          This test may fail intermittently if foreign processes will
+ *          try to establish connection to the test server socket.
  * @requires (os.family != "windows")
  * @library /test/lib
  * @build jdk.test.lib.Utils
@@ -43,6 +46,7 @@
 
 import java.io.IOException;
 import java.net.InetAddress;
+import java.net.InetSocketAddress;
 import java.net.ServerSocket;
 import java.net.Socket;
 import java.util.List;
@@ -82,7 +86,7 @@
             }
         }
 
-        final ServerSocket ss = new ServerSocket(0, 0, InetAddress.getLoopbackAddress()) {
+        final ServerSocket ss = new ServerSocket() {
             public Socket accept() throws IOException {
                 Socket s = new Socket() {
                 };
@@ -91,23 +95,29 @@
                 return s;
             }
         };
+        ss.bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0));
         Thread t = new Thread(new Runnable() {
             public void run() {
+                int repsCompleted = 0;
                 try {
-                    for (int i = 0; i < REPS; i++) {
+                    for (; repsCompleted < REPS; repsCompleted++) {
                         (new Socket(InetAddress.getLoopbackAddress(), ss.getLocalPort())).close();
                     }
                 } catch (IOException e) {
                     e.printStackTrace();
+                } finally {
+                    System.out.println("Client iterations completed:" + repsCompleted);
                 }
             }
         });
         t.start();
+        int repsCompleted = 0;
         try {
-            for (int i = 0; i < REPS; i++) {
+            for (; repsCompleted < REPS; repsCompleted++) {
                 ss.accept().close();
             }
         } finally {
+            System.out.println("Server iterations completed:" + repsCompleted);
             ss.close();
         }
         t.join();