RFR: JDK-8314272: Improve java.util.prefs.BackingStoreException: Couldn't get file lock. [v2]

Matthias Baesken mbaesken at openjdk.org
Fri Sep 1 13:14:43 UTC 2023


On Fri, 1 Sep 2023 12:36:28 GMT, Matthias Baesken <mbaesken at openjdk.org> wrote:

>> We run into some BackingStoreException: Couldn't get file lock. e.g. here :
>> 
>> [JShell] Exception in thread "main" java.lang.IllegalStateException: java.util.prefs.BackingStoreException: Couldn't get file lock.
>> [JShell] at jdk.jshell/jdk.internal.jshell.tool.JShellToolBuilder$PreferencesStorage.flush(JShellToolBuilder.java:313)
>> [JShell] at jdk.jshell/jdk.internal.jshell.tool.JShellTool$ReplayableHistory.storeHistory(JShellTool.java:692)
>> [JShell] at jdk.jshell/jdk.internal.jshell.tool.JShellTool.start(JShellTool.java:1008)
>> [JShell] at jdk.jshell/jdk.internal.jshell.tool.JShellToolBuilder.start(JShellToolBuilder.java:261)
>> [JShell] at jdk.jshell/jdk.internal.jshell.tool.JShellToolProvider.main(JShellToolProvider.java:120)
>> [JShell] Caused by: java.util.prefs.BackingStoreException: Couldn't get file lock.
>> [JShell] at java.prefs/java.util.prefs.FileSystemPreferences.sync(FileSystemPreferences.java:769)
>> [JShell] at java.prefs/java.util.prefs.FileSystemPreferences.flush(FileSystemPreferences.java:864)
>> [JShell] at jdk.jshell/jdk.internal.jshell.tool.JShellToolBuilder$PreferencesStorage.flush(JShellToolBuilder.java:311)
>> [JShell] ... 4 more
>> 
>> The BackingStoreException should be enhanced e.g. by adding the errno/errorCode that is already available in the coding
>
> Matthias Baesken has updated the pull request incrementally with one additional commit since the last revision:
> 
>   add for some errnos also the string

Hi Alan ,
Your assumption   'I assume the use of System.getProperty is problematic when running with a SM.'    is most likely correct.


java.desktop/share/classes/sun/awt/FontConfiguration.java-133-    protected void setOsNameAndVersion() {
java.desktop/share/classes/sun/awt/FontConfiguration.java:134:        osName = System.getProperty("os.name");
java.desktop/share/classes/sun/awt/FontConfiguration.java-135-        osVersion = System.getProperty("os.version");
java.desktop/share/classes/sun/awt/FontConfiguration.java-136-    }
java.desktop/share/classes/sun/awt/FontConfiguration.java-137-
--
java.management/share/classes/javax/management/loading/MLet.java-1054-         // the architecture-specific path name.  e.g. if user
java.management/share/classes/javax/management/loading/MLet.java-1055-         // requested a load for "foo" on Solaris SPARC 5.7 we try to
java.management/share/classes/javax/management/loading/MLet.java-1056-         // load "SunOS/sparc/5.7/lib/libfoo.so" from the JAR file.
java.management/share/classes/javax/management/loading/MLet.java-1057-         //
java.management/share/classes/javax/management/loading/MLet.java:1058:         nativelibname = removeSpace(System.getProperty("os.name")) + File.separator +
java.management/share/classes/javax/management/loading/MLet.java-1059-             removeSpace(System.getProperty("os.arch")) + File.separator +
java.management/share/classes/javax/management/loading/MLet.java-1060-             removeSpace(System.getProperty("os.version")) + File.separator +
java.management/share/classes/javax/management/loading/MLet.java-1061-             "lib" + File.separator + nativelibname;
java.management/share/classes/javax/management/loading/MLet.java-1062-         if (MLET_LOGGER.isLoggable(Level.TRACE)) {
--
java.management/share/classes/sun/management/VMManagementImpl.java-223-    // Operating System
java.management/share/classes/sun/management/VMManagementImpl.java-224-    public String getOsName() {
java.management/share/classes/sun/management/VMManagementImpl.java:225:        return System.getProperty("os.name");
java.management/share/classes/sun/management/VMManagementImpl.java-226-    }
java.management/share/classes/sun/management/VMManagementImpl.java-227-    public String getOsArch() {
java.management/share/classes/sun/management/VMManagementImpl.java-228-        return System.getProperty("os.arch");
java.management/share/classes/sun/management/VMManagementImpl.java-229-    }
--
jdk.compiler/share/classes/com/sun/tools/javac/jvm/JNIWriter.java-99-
jdk.compiler/share/classes/com/sun/tools/javac/jvm/JNIWriter.java-100-    private Context context;
jdk.compiler/share/classes/com/sun/tools/javac/jvm/JNIWriter.java-101-
jdk.compiler/share/classes/com/sun/tools/javac/jvm/JNIWriter.java-102-    private static final boolean isWindows =
jdk.compiler/share/classes/com/sun/tools/javac/jvm/JNIWriter.java:103:        System.getProperty("os.name").startsWith("Windows");
jdk.compiler/share/classes/com/sun/tools/javac/jvm/JNIWriter.java-104-
--
jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/PlatformInfo.java-29-
jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/PlatformInfo.java-30-public class PlatformInfo {
jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/PlatformInfo.java-31-  /* Returns "win32" if Windows; "linux" if Linux. */
jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/PlatformInfo.java-32-  public static String getOS() throws UnsupportedPlatformException {
jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/PlatformInfo.java:33:    String os = System.getProperty("os.name");
jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/PlatformInfo.java-34-    if (os.equals("Linux")) {
jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/PlatformInfo.java-35-      return "linux";
jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/PlatformInfo.java-36-    } else if (os.equals("FreeBSD")) {
jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/PlatformInfo.java-37-      return "bsd";
--
jdk.internal.le/share/classes/jdk/internal/org/jline/terminal/impl/ExecPty.java-131-        }
jdk.internal.le/share/classes/jdk/internal/org/jline/terminal/impl/ExecPty.java:132:        String undef = System.getProperty("os.name").toLowerCase().startsWith("hp") ? "^-" : "undef";
jdk.internal.le/share/classes/jdk/internal/org/jline/terminal/impl/ExecPty.java-133-        for (ControlChar cchar : ControlChar.values()) {
jdk.internal.le/share/classes/jdk/internal/org/jline/terminal/impl/ExecPty.java-134-            int v = attr.getControlChar(cchar);
jdk.internal.le/share/classes/jdk/internal/org/jline/terminal/impl/ExecPty.java-135-            if (v >= 0 && v != current.getControlChar(cchar)) {
jdk.internal.le/share/classes/jdk/internal/org/jline/terminal/impl/ExecPty.java-136-                String str = "";
--
jdk.internal.le/share/classes/jdk/internal/org/jline/terminal/impl/Diag.java-28-
jdk.internal.le/share/classes/jdk/internal/org/jline/terminal/impl/Diag.java-29-    static void diag(PrintStream out) {
jdk.internal.le/share/classes/jdk/internal/org/jline/terminal/impl/Diag.java-30-        out.println("System properties");
jdk.internal.le/share/classes/jdk/internal/org/jline/terminal/impl/Diag.java-31-        out.println("=================");
jdk.internal.le/share/classes/jdk/internal/org/jline/terminal/impl/Diag.java:32:        out.println("os.name =         " + System.getProperty("os.name"));
jdk.internal.le/share/classes/jdk/internal/org/jline/terminal/impl/Diag.java-33-        out.println("OSTYPE =          " + System.getenv("OSTYPE"));
jdk.internal.le/share/classes/jdk/internal/org/jline/terminal/impl/Diag.java-34-        out.println("MSYSTEM =         " + System.getenv("MSYSTEM"));
jdk.internal.le/share/classes/jdk/internal/org/jline/terminal/impl/Diag.java-35-        out.println("PWD =             " + System.getenv("PWD"));
jdk.internal.le/share/classes/jdk/internal/org/jline/terminal/impl/Diag.java-36-        out.println("ConEmuPID =       " + System.getenv("ConEmuPID"));
--
jdk.internal.le/share/classes/jdk/internal/org/jline/utils/OSUtils.java-13-import java.nio.file.Paths;
jdk.internal.le/share/classes/jdk/internal/org/jline/utils/OSUtils.java-14-
jdk.internal.le/share/classes/jdk/internal/org/jline/utils/OSUtils.java-15-public class OSUtils {
jdk.internal.le/share/classes/jdk/internal/org/jline/utils/OSUtils.java-16-
jdk.internal.le/share/classes/jdk/internal/org/jline/utils/OSUtils.java:17:    public static final boolean IS_WINDOWS = System.getProperty("os.name").toLowerCase().contains("win");
jdk.internal.le/share/classes/jdk/internal/org/jline/utils/OSUtils.java-18-
jdk.internal.le/share/classes/jdk/internal/org/jline/utils/OSUtils.java-19-    public static final boolean IS_CYGWIN = IS_WINDOWS
jdk.internal.le/share/classes/jdk/internal/org/jline/utils/OSUtils.java-20-            && System.getenv("PWD") != null
jdk.internal.le/share/classes/jdk/internal/org/jline/utils/OSUtils.java-21-            && System.getenv("PWD").startsWith("/");
--
jdk.internal.le/share/classes/jdk/internal/org/jline/utils/OSUtils.java-38-
jdk.internal.le/share/classes/jdk/internal/org/jline/utils/OSUtils.java-39-    public static final boolean IS_CONEMU = IS_WINDOWS
jdk.internal.le/share/classes/jdk/internal/org/jline/utils/OSUtils.java-40-            && System.getenv("ConEmuPID") != null;
jdk.internal.le/share/classes/jdk/internal/org/jline/utils/OSUtils.java-41-
jdk.internal.le/share/classes/jdk/internal/org/jline/utils/OSUtils.java:42:    public static final boolean IS_OSX = System.getProperty("os.name").toLowerCase().contains("mac");
jdk.internal.le/share/classes/jdk/internal/org/jline/utils/OSUtils.java:43:    public static final boolean IS_AIX = System.getProperty("os.name").equals("AIX");
jdk.internal.le/share/classes/jdk/internal/org/jline/utils/OSUtils.java-44-
--
jdk.internal.vm.ci/share/classes/jdk/vm/ci/services/Services.java-349-            case LINUX: return "Linux";
jdk.internal.vm.ci/share/classes/jdk/vm/ci/services/Services.java-350-            case MACOS: return "Mac OS X";
jdk.internal.vm.ci/share/classes/jdk/vm/ci/services/Services.java-351-            case AIX: return "AIX";
jdk.internal.vm.ci/share/classes/jdk/vm/ci/services/Services.java-352-            case WINDOWS: {
jdk.internal.vm.ci/share/classes/jdk/vm/ci/services/Services.java:353:                String osName = System.getProperty("os.name");
jdk.internal.vm.ci/share/classes/jdk/vm/ci/services/Services.java-354-                if (osName.startsWith("Windows")) {
jdk.internal.vm.ci/share/classes/jdk/vm/ci/services/Services.java-355-                    // Use original value which is often more "complete"
jdk.internal.vm.ci/share/classes/jdk/vm/ci/services/Services.java-356-                    // E.g. "Windows Server 2012"
jdk.internal.vm.ci/share/classes/jdk/vm/ci/services/Services.java-357-                    return osName;
--
jdk.security.auth/share/classes/com/sun/security/auth/module/NTLoginModule.java-148-            }
jdk.security.auth/share/classes/com/sun/security/auth/module/NTLoginModule.java-149-            throw new FailedLoginException
jdk.security.auth/share/classes/com/sun/security/auth/module/NTLoginModule.java-150-                ("Failed in attempt to import the " +
jdk.security.auth/share/classes/com/sun/security/auth/module/NTLoginModule.java-151-                 "underlying NT system identity information" +
jdk.security.auth/share/classes/com/sun/security/auth/module/NTLoginModule.java:152:                 " on " + System.getProperty("os.name"));
jdk.security.auth/share/classes/com/sun/security/auth/module/NTLoginModule.java-153-        }
--
jdk.security.auth/share/classes/com/sun/security/auth/module/UnixLoginModule.java-128-            succeeded = false;
jdk.security.auth/share/classes/com/sun/security/auth/module/UnixLoginModule.java-129-            throw new FailedLoginException
jdk.security.auth/share/classes/com/sun/security/auth/module/UnixLoginModule.java-130-                                ("Failed in attempt to import " +
jdk.security.auth/share/classes/com/sun/security/auth/module/UnixLoginModule.java-131-                                "the underlying system identity information" +
jdk.security.auth/share/classes/com/sun/security/auth/module/UnixLoginModule.java:132:                                " on " + System.getProperty("os.name"));
jdk.security.auth/share/classes/com/sun/security/auth/module/UnixLoginModule.java-133-        }
--
jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java-83-class ZipFileSystem extends FileSystem {
jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java-84-    // statics
jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java-85-    @SuppressWarnings("removal")
jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java-86-    private static final boolean isWindows = AccessController.doPrivileged(
jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java:87:        (PrivilegedAction<Boolean>)()->System.getProperty("os.name")
jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java-88-                                             .startsWith("Windows"));
jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java-89-    private static final byte[] ROOTPATH = new byte[] { '/' };
jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java-90-    private static final String PROPERTY_POSIX = "enablePosixFileAttributes";
jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java-91-    private static final String PROPERTY_DEFAULT_OWNER = "defaultOwner";



Any idea why it is done so seldom in the codebase ?  ZipFileSystem.java does it, but most other calls (see above) seems to omit / 'forget' it . Is there something about the other calls, that it is not needed there ?

-------------

PR Comment: https://git.openjdk.org/jdk/pull/15308#issuecomment-1702726371


More information about the core-libs-dev mailing list