8043838: Test java/net/ServerSocket/AcceptCauseFileDescriptorLeak.java failed intermittently in nightly
authorxiaofeya
Wed, 07 Dec 2016 17:15:03 -0800
changeset 42449 ec908b8eb5cc
parent 42448 67328babe531
child 42450 d1a9006aec4a
8043838: Test java/net/ServerSocket/AcceptCauseFileDescriptorLeak.java failed intermittently in nightly Reviewed-by: chegar, dfuchs
jdk/test/java/net/ServerSocket/AcceptCauseFileDescriptorLeak.java
jdk/test/java/net/ServerSocket/AcceptCauseFileDescriptorLeak.sh
--- a/jdk/test/java/net/ServerSocket/AcceptCauseFileDescriptorLeak.java	Wed Dec 07 17:08:21 2016 -0800
+++ b/jdk/test/java/net/ServerSocket/AcceptCauseFileDescriptorLeak.java	Wed Dec 07 17:15:03 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -22,21 +22,64 @@
  */
 
 /*
- * Test run from script, AcceptCauseFileDescriptorLeak.sh
  * author Edward Wang
+ *
+ * @test
+ * @bug 6368984
+ * @summary Configuring unconnected Socket before passing to implAccept
+ *          can cause fd leak
+ * @requires (os.family != "windows")
+ * @library /test/lib
+ * @build jdk.test.lib.JDKToolFinder
+ *        jdk.test.lib.process.OutputAnalyzer
+ *        AcceptCauseFileDescriptorLeak
+ * @run main/othervm AcceptCauseFileDescriptorLeak root
  */
 
 import java.io.IOException;
 import java.net.ServerSocket;
 import java.net.Socket;
+import java.util.List;
+
+import jdk.test.lib.JDKToolFinder;
+import jdk.test.lib.process.OutputAnalyzer;
 
 public class AcceptCauseFileDescriptorLeak {
     private static final int REPS = 2048;
+    private static final int THRESHOLD = 1024;
 
     public static void main(String[] args) throws Exception {
+        if (args.length != 0) {
+            OutputAnalyzer analyzer = execCmd("ulimit -n -H");
+            String output = analyzer.getOutput();
+            if (output == null || output.length() == 0) {
+                throw new RuntimeException("\"ulimit -n -H\" output nothing"
+                        + " and its exit code is " + analyzer.getExitValue());
+            } else {
+                output = output.trim();
+                // Set max open file descriptors to 1024
+                // if it is unlimited or greater than 1024,
+                // otherwise just do test directly
+                if ("unlimited".equals(output)
+                        || Integer.valueOf(output) > THRESHOLD) {
+                    analyzer = execCmd("ulimit -n " + THRESHOLD + "; "
+                            + composeJavaTestStr());
+                    System.out.println("Output: ["
+                            + analyzer.getOutput() + "]");
+                    int rc = analyzer.getExitValue();
+                    if (rc != 0) {
+                        throw new RuntimeException(
+                                "Unexpected exit code: " + rc);
+                    }
+                    return;
+                }
+            }
+        }
+
         final ServerSocket ss = new ServerSocket(0) {
             public Socket accept() throws IOException {
-                Socket s = new Socket() { };
+                Socket s = new Socket() {
+                };
                 s.setSoTimeout(10000);
                 implAccept(s);
                 return s;
@@ -54,10 +97,33 @@
             }
         });
         t.start();
-        for (int i = 0; i < REPS; i++) {
-            ss.accept().close();
+        try {
+            for (int i = 0; i < REPS; i++) {
+                ss.accept().close();
+            }
+        } finally {
+            ss.close();
         }
-        ss.close();
         t.join();
     }
+
+    /**
+     * Execute command with shell
+     *
+     * @param  command
+     * @return OutputAnalyzer
+     * @throws IOException
+     */
+    static OutputAnalyzer execCmd(String command) throws IOException {
+        List<String> cmd = List.of("sh", "-c", command);
+        System.out.println("Executing: " + cmd);
+        ProcessBuilder pb = new ProcessBuilder(cmd);
+        return new OutputAnalyzer(pb.start());
+    }
+
+    static String composeJavaTestStr() {
+        return JDKToolFinder.getTestJDKTool("java") + " "
+                + AcceptCauseFileDescriptorLeak.class.getName();
+    }
 }
+
--- a/jdk/test/java/net/ServerSocket/AcceptCauseFileDescriptorLeak.sh	Wed Dec 07 17:08:21 2016 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-#
-# Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation.
-#
-# This code is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#
-
-# @test
-# @bug 6368984
-# @summary configuring unconnected Socket before passing to implAccept can cause fd leak
-# @build AcceptCauseFileDescriptorLeak
-# @run shell AcceptCauseFileDescriptorLeak.sh
-
-OS=`uname -s`
-case "$OS" in
-    Windows_* | CYGWIN* )
-        echo "ulimit not on Windows"
-        exit 0
-        ;;
-    * )
-        CLASSPATH=${TESTCLASSES}:${TESTSRC}
-        ;;
-esac
-export CLASSPATH
-
-# hard limit needs to be less than 1024 for this bug
-NOFILES=`ulimit -n -H`
-if [ "$NOFILES" = "unlimited" ] || [ $NOFILES -ge 1024 ]; then
-    ulimit -n 1024
-fi
-
-${TESTJAVA}/bin/java ${TESTVMOPTS} AcceptCauseFileDescriptorLeak