From 3abaa83610efb5c8e9b86c6f895d6b58d21e1fa2 Mon Sep 17 00:00:00 2001 From: Stefan Karlsson Date: Wed, 3 Sep 2025 13:51:17 +0000 Subject: [PATCH] 8366298: FDLeakTest sometimes takes minutes to complete on Linux Reviewed-by: lkorinth, rriggs, stuefe --- .../ProcessBuilder/FDLeakTest/FDLeakTest.java | 6 +-- .../ProcessBuilder/FDLeakTest/libFDLeaker.c | 39 +++++++++++++++++++ 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/test/jdk/java/lang/ProcessBuilder/FDLeakTest/FDLeakTest.java b/test/jdk/java/lang/ProcessBuilder/FDLeakTest/FDLeakTest.java index 02f3583f0b3..146c2be563f 100644 --- a/test/jdk/java/lang/ProcessBuilder/FDLeakTest/FDLeakTest.java +++ b/test/jdk/java/lang/ProcessBuilder/FDLeakTest/FDLeakTest.java @@ -27,7 +27,7 @@ * @summary Check that we don't leak FDs * @requires os.family != "windows" * @library /test/lib - * @run main/othervm/native/timeout=480 -Djdk.lang.Process.launchMechanism=posix_spawn -agentlib:FDLeaker FDLeakTest + * @run main/othervm/native -Djdk.lang.Process.launchMechanism=posix_spawn -agentlib:FDLeaker FDLeakTest */ /** @@ -35,7 +35,7 @@ * @summary Check that we don't leak FDs * @requires os.family != "windows" * @library /test/lib - * @run main/othervm/native/timeout=480 -Djdk.lang.Process.launchMechanism=fork -agentlib:FDLeaker FDLeakTest + * @run main/othervm/native -Djdk.lang.Process.launchMechanism=fork -agentlib:FDLeaker FDLeakTest */ /** @@ -43,7 +43,7 @@ * @summary Check that we don't leak FDs * @requires os.family == "linux" * @library /test/lib - * @run main/othervm/native/timeout=480 -Djdk.lang.Process.launchMechanism=vfork -agentlib:FDLeaker FDLeakTest + * @run main/othervm/native -Djdk.lang.Process.launchMechanism=vfork -agentlib:FDLeaker FDLeakTest */ import jdk.test.lib.process.ProcessTools; diff --git a/test/jdk/java/lang/ProcessBuilder/FDLeakTest/libFDLeaker.c b/test/jdk/java/lang/ProcessBuilder/FDLeakTest/libFDLeaker.c index b3fa296cae2..afec94f65c7 100644 --- a/test/jdk/java/lang/ProcessBuilder/FDLeakTest/libFDLeaker.c +++ b/test/jdk/java/lang/ProcessBuilder/FDLeakTest/libFDLeaker.c @@ -21,16 +21,55 @@ * questions. */ +#include #include +#include +#include +#include #include "jvmti.h" +static jint limit_num_fds(); + JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *jvm, char *options, void *reserved) { + // Lower the number of possible open files to make the test go faster + jint ret = limit_num_fds(); + if (ret != 0) { + fprintf(stderr, "Failed to limit number of fds: %s", strerror(errno)); + return ret; + } + const char* filename = "./testfile_FDLeaker.txt"; FILE* f = fopen(filename, "w"); if (f == NULL) { + fprintf(stderr, "Failed to open file: %s", strerror(errno)); return JNI_ERR; } + printf("Opened and leaked %s (%d)", filename, fileno(f)); return JNI_OK; } + +static jint limit_num_fds() { + struct rlimit rl; + + // Fetch the current limit + int ret = getrlimit(RLIMIT_NOFILE, &rl); + if (ret != 0) { + return JNI_ERR; + } + + // Use a lower value unless it is already low + rlim_t limit = 100; + if (limit < rl.rlim_cur) { + rl.rlim_cur = limit; + } + + // Lower the value + int ret2 = setrlimit(RLIMIT_NOFILE, &rl); + if (ret2 != 0) { + return JNI_ERR; + } + + return JNI_OK; +}