7060790: (fs) FileSystem.newWatchService error message confusing when maximum inotify descriptors reached
Alan Bateman
Alan.Bateman at oracle.com
Sat Aug 27 06:18:00 PDT 2011
This is a minor tweak to the WatchService implementation on Linux so
that it prints a more useful message in the event that the system is out
of inotify instances. The errno when inotify_init fails in this case is
EMFILE and so the IOException is thrown with "Too many open files" which
can be confused with running out of file descriptors. The patch simple
translates this error into a more useful message to aid diagnosing the
issue. I don't propose to include a test with this as tests that check
exception message tend to be too fragile.
Thanks,
Alan.
diff --git a/src/solaris/classes/sun/nio/fs/LinuxWatchService.java
b/src/solaris/classes/sun/nio/fs/LinuxWatchService.java
--- a/src/solaris/classes/sun/nio/fs/LinuxWatchService.java
+++ b/src/solaris/classes/sun/nio/fs/LinuxWatchService.java
@@ -58,7 +58,10 @@ class LinuxWatchService
try {
ifd = inotifyInit();
} catch (UnixException x) {
- throw new IOException(x.errorString());
+ String msg = (x.errno() == EMFILE) ?
+ "User limit of inotify instances reached or too many
open files" :
+ x.errorString();
+ throw new IOException(msg);
}
// configure inotify to be non-blocking
diff --git a/src/solaris/native/sun/nio/fs/genUnixConstants.c
b/src/solaris/native/sun/nio/fs/genUnixConstants.c
--- a/src/solaris/native/sun/nio/fs/genUnixConstants.c
+++ b/src/solaris/native/sun/nio/fs/genUnixConstants.c
@@ -108,6 +108,7 @@ int main(int argc, const char* argv[]) {
DEF(EROFS);
DEF(ENODATA);
DEF(ERANGE);
+ DEF(EMFILE);
// flags used with openat/unlinkat/etc.
#if defined(AT_SYMLINK_NOFOLLOW) && defined(AT_REMOVEDIR)
More information about the nio-dev
mailing list