8202292: java/io/FileOutputStream/UnreferencedFOSClosesFd.java fails with "raw fd count wrong"

Reviewed-by: bpb, mchung
This commit is contained in:
Roger Riggs 2018-06-22 16:06:43 -04:00
parent a8a82bb0ba
commit 49396d51e9
5 changed files with 131 additions and 101 deletions
test
jdk
lib/jdk/test/lib/util

@ -535,10 +535,6 @@ java/lang/management/ThreadMXBean/ThreadMXBeanStateTest.java 8081652 generic-
java/io/pathNames/GeneralWin32.java 8180264 windows-all
java/io/FileInputStream/UnreferencedFISClosesFd.java 8202292 linux-all
java/io/FileOutputStream/UnreferencedFOSClosesFd.java 8202292 linux-all
java/io/RandomAccessFile/UnreferencedRAFClosesFd.java 8202292 linux-all
############################################################################
# jdk_management
@ -620,60 +616,60 @@ sun/security/provider/KeyStore/DKSTest.sh 8180266 windows-
sun/security/pkcs11/Cipher/ReinitCipher.java 8204203 windows-all
sun/security/pkcs11/Cipher/TestPKCS5PaddingError.java 8204203 windows-all
sun/security/pkcs11/Cipher/TestRSACipher.java 8204203 windows-all
sun/security/pkcs11/Cipher/TestRSACipherWrap.java 8204203 windows-all
sun/security/pkcs11/Cipher/TestRawRSACipher.java 8204203 windows-all
sun/security/pkcs11/Cipher/TestSymmCiphers.java 8204203 windows-all
sun/security/pkcs11/Cipher/TestSymmCiphersNoPad.java 8204203 windows-all
sun/security/pkcs11/KeyAgreement/SupportedDHKeys.java 8204203 windows-all
sun/security/pkcs11/KeyAgreement/TestDH.java 8204203 windows-all
sun/security/pkcs11/KeyAgreement/TestInterop.java 8204203 windows-all
sun/security/pkcs11/KeyAgreement/TestShort.java 8204203 windows-all
sun/security/pkcs11/KeyAgreement/UnsupportedDHKeys.java 8204203 windows-all
sun/security/pkcs11/KeyGenerator/DESParity.java 8204203 windows-all
sun/security/pkcs11/KeyGenerator/TestKeyGenerator.java 8204203 windows-all
sun/security/pkcs11/KeyPairGenerator/TestDH2048.java 8204203 windows-all
sun/security/pkcs11/KeyStore/SecretKeysBasic.sh 8204203 windows-all
sun/security/pkcs11/Mac/MacKAT.java 8204203 windows-all
sun/security/pkcs11/Mac/MacSameTest.java 8204203 windows-all
sun/security/pkcs11/Mac/ReinitMac.java 8204203 windows-all
sun/security/pkcs11/MessageDigest/ByteBuffers.java 8204203 windows-all
sun/security/pkcs11/MessageDigest/DigestKAT.java 8204203 windows-all
sun/security/pkcs11/MessageDigest/ReinitDigest.java 8204203 windows-all
sun/security/pkcs11/MessageDigest/TestCloning.java 8204203 windows-all
sun/security/pkcs11/Provider/ConfigQuotedString.sh 8204203 windows-all
sun/security/pkcs11/Provider/Login.sh 8204203 windows-all
sun/security/pkcs11/SampleTest.java 8204203 windows-all
sun/security/pkcs11/Secmod/AddPrivateKey.java 8204203 windows-all
sun/security/pkcs11/Secmod/Crypto.java 8204203 windows-all
sun/security/pkcs11/Secmod/GetPrivateKey.java 8204203 windows-all
sun/security/pkcs11/Secmod/JksSetPrivateKey.java 8204203 windows-all
sun/security/pkcs11/Secmod/LoadKeystore.java 8204203 windows-all
sun/security/pkcs11/Secmod/TestNssDbSqlite.java 8204203 windows-all
sun/security/pkcs11/SecureRandom/Basic.java 8204203 windows-all
sun/security/pkcs11/SecureRandom/TestDeserialization.java 8204203 windows-all
sun/security/pkcs11/Serialize/SerializeProvider.java 8204203 windows-all
sun/security/pkcs11/Signature/ByteBuffers.java 8204203 windows-all
sun/security/pkcs11/Signature/ReinitSignature.java 8204203 windows-all
sun/security/pkcs11/Signature/TestDSA.java 8204203 windows-all
sun/security/pkcs11/Signature/TestDSAKeyLength.java 8204203 windows-all
sun/security/pkcs11/Signature/TestRSAKeyLength.java 8204203 windows-all
sun/security/pkcs11/ec/ReadCertificates.java 8204203 windows-all
sun/security/pkcs11/ec/ReadPKCS12.java 8204203 windows-all
sun/security/pkcs11/ec/TestCurves.java 8204203 windows-all
sun/security/pkcs11/ec/TestECDH.java 8204203 windows-all
sun/security/pkcs11/ec/TestECDH2.java 8204203 windows-all
sun/security/pkcs11/ec/TestECDSA.java 8204203 windows-all
sun/security/pkcs11/ec/TestECDSA2.java 8204203 windows-all
sun/security/pkcs11/ec/TestECGenSpec.java 8204203 windows-all
sun/security/pkcs11/rsa/KeyWrap.java 8204203 windows-all
sun/security/pkcs11/rsa/TestCACerts.java 8204203 windows-all
sun/security/pkcs11/rsa/TestKeyFactory.java 8204203 windows-all
sun/security/pkcs11/rsa/TestKeyPairGenerator.java 8204203 windows-all
sun/security/pkcs11/rsa/TestSignatures.java 8204203 windows-all
sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java 8204203 windows-all
sun/security/pkcs11/tls/TestLeadingZeroesP11.java 8204203 windows-all
sun/security/pkcs11/tls/TestMasterSecret.java 8204203 windows-all
sun/security/pkcs11/tls/TestPRF.java 8204203 windows-all
sun/security/pkcs11/Cipher/TestRSACipherWrap.java 8204203 windows-all
sun/security/pkcs11/Cipher/TestRawRSACipher.java 8204203 windows-all
sun/security/pkcs11/Cipher/TestSymmCiphers.java 8204203 windows-all
sun/security/pkcs11/Cipher/TestSymmCiphersNoPad.java 8204203 windows-all
sun/security/pkcs11/KeyAgreement/SupportedDHKeys.java 8204203 windows-all
sun/security/pkcs11/KeyAgreement/TestDH.java 8204203 windows-all
sun/security/pkcs11/KeyAgreement/TestInterop.java 8204203 windows-all
sun/security/pkcs11/KeyAgreement/TestShort.java 8204203 windows-all
sun/security/pkcs11/KeyAgreement/UnsupportedDHKeys.java 8204203 windows-all
sun/security/pkcs11/KeyGenerator/DESParity.java 8204203 windows-all
sun/security/pkcs11/KeyGenerator/TestKeyGenerator.java 8204203 windows-all
sun/security/pkcs11/KeyPairGenerator/TestDH2048.java 8204203 windows-all
sun/security/pkcs11/KeyStore/SecretKeysBasic.sh 8204203 windows-all
sun/security/pkcs11/Mac/MacKAT.java 8204203 windows-all
sun/security/pkcs11/Mac/MacSameTest.java 8204203 windows-all
sun/security/pkcs11/Mac/ReinitMac.java 8204203 windows-all
sun/security/pkcs11/MessageDigest/ByteBuffers.java 8204203 windows-all
sun/security/pkcs11/MessageDigest/DigestKAT.java 8204203 windows-all
sun/security/pkcs11/MessageDigest/ReinitDigest.java 8204203 windows-all
sun/security/pkcs11/MessageDigest/TestCloning.java 8204203 windows-all
sun/security/pkcs11/Provider/ConfigQuotedString.sh 8204203 windows-all
sun/security/pkcs11/Provider/Login.sh 8204203 windows-all
sun/security/pkcs11/SampleTest.java 8204203 windows-all
sun/security/pkcs11/Secmod/AddPrivateKey.java 8204203 windows-all
sun/security/pkcs11/Secmod/Crypto.java 8204203 windows-all
sun/security/pkcs11/Secmod/GetPrivateKey.java 8204203 windows-all
sun/security/pkcs11/Secmod/JksSetPrivateKey.java 8204203 windows-all
sun/security/pkcs11/Secmod/LoadKeystore.java 8204203 windows-all
sun/security/pkcs11/Secmod/TestNssDbSqlite.java 8204203 windows-all
sun/security/pkcs11/SecureRandom/Basic.java 8204203 windows-all
sun/security/pkcs11/SecureRandom/TestDeserialization.java 8204203 windows-all
sun/security/pkcs11/Serialize/SerializeProvider.java 8204203 windows-all
sun/security/pkcs11/Signature/ByteBuffers.java 8204203 windows-all
sun/security/pkcs11/Signature/ReinitSignature.java 8204203 windows-all
sun/security/pkcs11/Signature/TestDSA.java 8204203 windows-all
sun/security/pkcs11/Signature/TestDSAKeyLength.java 8204203 windows-all
sun/security/pkcs11/Signature/TestRSAKeyLength.java 8204203 windows-all
sun/security/pkcs11/ec/ReadCertificates.java 8204203 windows-all
sun/security/pkcs11/ec/ReadPKCS12.java 8204203 windows-all
sun/security/pkcs11/ec/TestCurves.java 8204203 windows-all
sun/security/pkcs11/ec/TestECDH.java 8204203 windows-all
sun/security/pkcs11/ec/TestECDH2.java 8204203 windows-all
sun/security/pkcs11/ec/TestECDSA.java 8204203 windows-all
sun/security/pkcs11/ec/TestECDSA2.java 8204203 windows-all
sun/security/pkcs11/ec/TestECGenSpec.java 8204203 windows-all
sun/security/pkcs11/rsa/KeyWrap.java 8204203 windows-all
sun/security/pkcs11/rsa/TestCACerts.java 8204203 windows-all
sun/security/pkcs11/rsa/TestKeyFactory.java 8204203 windows-all
sun/security/pkcs11/rsa/TestKeyPairGenerator.java 8204203 windows-all
sun/security/pkcs11/rsa/TestSignatures.java 8204203 windows-all
sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java 8204203 windows-all
sun/security/pkcs11/tls/TestLeadingZeroesP11.java 8204203 windows-all
sun/security/pkcs11/tls/TestMasterSecret.java 8204203 windows-all
sun/security/pkcs11/tls/TestPRF.java 8204203 windows-all
sun/security/pkcs11/tls/TestPremaster.java 8204203 windows-all
############################################################################

@ -25,6 +25,8 @@
*
* @test
* @modules java.base/java.io:open
* @library /test/lib
* @build jdk.test.lib.util.FileUtils UnreferencedFISClosesFd
* @bug 6524062
* @summary Test to ensure that FIS.finalize() invokes the close() method as per
* the specification.
@ -41,18 +43,15 @@ import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.lang.reflect.Field;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayDeque;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import com.sun.management.UnixOperatingSystemMXBean;
import jdk.test.lib.util.FileUtils;
/**
* Tests for FIS unreferenced.
* - Not subclassed - cleaner cleanup
@ -146,8 +145,8 @@ public class UnreferencedFISClosesFd {
String name = inFile.getPath();
FileUtils.listFileDescriptors(System.out);
long fdCount0 = getFdCount();
System.out.printf("initial count of open file descriptors: %d%n", fdCount0);
int failCount = 0;
failCount += test(new FileInputStream(name), CleanupType.CLEANER);
@ -166,11 +165,10 @@ public class UnreferencedFISClosesFd {
// Check the final count of open file descriptors
long fdCount = getFdCount();
System.out.printf("final count of open file descriptors: %d%n", fdCount);
if (fdCount != fdCount0) {
listProcFD();
throw new AssertionError("raw fd count wrong: expected: " + fdCount0
+ ", actual: " + fdCount);
System.out.printf("initial count of open file descriptors: %d%n", fdCount0);
System.out.printf("final count of open file descriptors: %d%n", fdCount);
FileUtils.listFileDescriptors(System.out);
}
}
@ -274,27 +272,4 @@ public class UnreferencedFISClosesFd {
}
return 0;
}
/**
* Method to list the open file descriptors (if supported by the 'lsof' command).
*/
static void listProcFD() {
List<String> lsofDirs = List.of("/usr/bin", "/usr/sbin");
Optional<Path> lsof = lsofDirs.stream()
.map(s -> Paths.get(s, "lsof"))
.filter(f -> Files.isExecutable(f))
.findFirst();
lsof.ifPresent(exe -> {
try {
System.out.printf("Open File Descriptors:%n");
long pid = ProcessHandle.current().pid();
ProcessBuilder pb = new ProcessBuilder(exe.toString(), "-p", Integer.toString((int) pid));
pb.inheritIO();
Process p = pb.start();
p.waitFor(10, TimeUnit.SECONDS);
} catch (IOException | InterruptedException ie) {
ie.printStackTrace();
}
});
}
}

@ -25,6 +25,8 @@
*
* @test
* @modules java.base/java.io:open
* @library /test/lib
* @build jdk.test.lib.util.FileUtils UnreferencedFOSClosesFd
* @bug 6524062
* @summary Test to ensure that FOS.finalize() invokes the close() method as per
* the specification.
@ -41,11 +43,15 @@ import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.lang.reflect.Field;
import java.nio.file.Path;
import java.util.ArrayDeque;
import java.util.HashSet;
import java.util.concurrent.atomic.AtomicInteger;
import com.sun.management.UnixOperatingSystemMXBean;
import jdk.test.lib.util.FileUtils;
public class UnreferencedFOSClosesFd {
enum CleanupType {
@ -133,8 +139,8 @@ public class UnreferencedFOSClosesFd {
String name = inFile.getPath();
FileUtils.listFileDescriptors(System.out);
long fdCount0 = getFdCount();
System.out.printf("initial count of open file descriptors: %d%n", fdCount0);
int failCount = 0;
failCount += test(new FileOutputStream(name), CleanupType.CLEANER);
@ -153,10 +159,10 @@ public class UnreferencedFOSClosesFd {
// Check the final count of open file descriptors
long fdCount = getFdCount();
System.out.printf("final count of open file descriptors: %d%n", fdCount);
if (fdCount != fdCount0) {
throw new AssertionError("raw fd count wrong: expected: " + fdCount0
+ ", actual: " + fdCount);
System.out.printf("initial count of open file descriptors: %d%n", fdCount0);
System.out.printf("final count of open file descriptors: %d%n", fdCount);
FileUtils.listFileDescriptors(System.out);
}
}

@ -24,6 +24,7 @@
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean;
@ -32,13 +33,19 @@ import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.lang.reflect.Field;
import java.nio.file.Path;
import java.util.ArrayDeque;
import java.util.HashSet;
import com.sun.management.UnixOperatingSystemMXBean;
import jdk.test.lib.util.FileUtils;
/**
* @test
* @bug 8080225
* @library /test/lib
* @build jdk.test.lib.util.FileUtils UnreferencedRAFClosesFd
* @modules java.base/java.io:open
* @summary Test to ensure that an unclosed and unreferenced RandomAccessFile closes the fd
* @run main/othervm UnreferencedRAFClosesFd
@ -54,8 +61,8 @@ public class UnreferencedRAFClosesFd {
inFile.createNewFile();
inFile.deleteOnExit();
FileUtils.listFileDescriptors(System.out);
long fdCount0 = getFdCount();
System.out.printf("initial count of open file descriptors: %d%n", fdCount0);
String name = inFile.getPath();
RandomAccessFile raf;
@ -101,10 +108,10 @@ public class UnreferencedRAFClosesFd {
// Check the final count of open file descriptors
long fdCount = getFdCount();
System.out.printf("final count of open file descriptors: %d%n", fdCount);
if (fdCount != fdCount0) {
throw new AssertionError("raw fd count wrong: expected: " + fdCount0
+ ", actual: " + fdCount);
System.out.printf("initial count of open file descriptors: %d%n", fdCount0);
System.out.printf("final count of open file descriptors: %d%n", fdCount);
FileUtils.listFileDescriptors(System.out);
}
}

@ -1,5 +1,5 @@
/*
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2017, 2018, 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
@ -26,18 +26,26 @@ package jdk.test.lib.util;
import jdk.test.lib.Platform;
import java.io.IOException;
import java.io.PrintStream;
import java.io.UncheckedIOException;
import java.lang.ProcessBuilder.Redirect;
import java.nio.file.DirectoryNotEmptyException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.time.Instant;
import java.time.Duration;
import java.util.ArrayList;
import java.util.ArrayDeque;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
/**
* Common library for various test file utility functions.
*/
@ -227,4 +235,42 @@ public final class FileUtils {
}
return areFileSystemsAccessible;
}
/**
* List the open file descriptors (if supported by the 'lsof' command).
* @param ps a printStream to send the output to
* @throws UncheckedIOException if an error occurs
*/
public static void listFileDescriptors(PrintStream ps) {
List<String> lsofDirs = List.of("/usr/bin", "/usr/sbin");
Optional<Path> lsof = lsofDirs.stream()
.map(s -> Paths.get(s, "lsof"))
.filter(f -> Files.isExecutable(f))
.findFirst();
lsof.ifPresent(exe -> {
try {
ps.printf("Open File Descriptors:%n");
long pid = ProcessHandle.current().pid();
ProcessBuilder pb = new ProcessBuilder(exe.toString(), "-p", Integer.toString((int) pid));
pb.redirectErrorStream(true); // combine stderr and stdout
pb.redirectOutput(Redirect.PIPE);
Process p = pb.start();
Instant start = Instant.now();
p.getInputStream().transferTo(ps);
try {
int timeout = 10;
if (!p.waitFor(timeout, TimeUnit.SECONDS)) {
System.out.printf("waitFor timed out: %d%n", timeout);
}
} catch (InterruptedException ie) {
throw new IOException("interrupted", ie);
}
ps.println();
} catch (IOException ioe) {
throw new UncheckedIOException("error listing file descriptors", ioe);
}
});
}
}