malklavious
asked on
FileChannel.tryLock : IOException: Invalid argument
I've run into a baffling problem porting a Java program over to a FreeBSD system from Trustix. When I try to obtain a file lock on a RandomAccessFile I get an "Invalid Argument" exception.
When searching for a fix I found reference to 64-bit systems having problems with this, but that has been fixed in java 1.4.3 (IIRC). I did try passing in a block size to tryLock() (ie: tryLock(0L, 1024L, false) ) but that did not change the result.
See code snippet for code and exception.
System:
FreeBSD 7.1, 64bit
Filesystem: UFS
java: jdk 1.6.0
Anyone have any input on this?
When searching for a fix I found reference to 64-bit systems having problems with this, but that has been fixed in java 1.4.3 (IIRC). I did try passing in a block size to tryLock() (ie: tryLock(0L, 1024L, false) ) but that did not change the result.
See code snippet for code and exception.
System:
FreeBSD 7.1, 64bit
Filesystem: UFS
java: jdk 1.6.0
Anyone have any input on this?
// code
FileChannel channel = new RandomAccessFile("fileLockTest","rw").getChannel();
FileLock lock = channel.tryLock();
// exception
java.io.IOException: Invalid argument
at sun.nio.ch.FileChannelImpl.lock0(Native Method)
at sun.nio.ch.FileChannelImpl.tryLock(FileChannelImpl.java:924)
at java.nio.channels.FileChannel.tryLock(FileChannel.java:978)
at FileLockTest.obtainRefreshLock(FileLockTest.java:47)
ASKER
I was doing that at first, moved to the tryLock as I was trying to figure out a way to get it to work.
Tried it again, still getting the exception, now on the "channel.lock()" line.
Tried it again, still getting the exception, now on the "channel.lock()" line.
// code
FileChannel channel = new RandomAccessFile("fileLockTest","rws").getChannel();
FileLock lock = channel.lock(); // <-- exception thrown here
// exception
java.io.IOException: Invalid argument
at sun.nio.ch.FileChannelImpl.lock0(Native Method)
at sun.nio.ch.FileChannelImpl.lock(FileChannelImpl.java:887)
at java.nio.channels.FileChannel.lock(FileChannel.java:876)
at FileLockTest.obtainRefreshLock(FileLockTest.java:66)
> I did try passing in a block size to tryLock() (ie: tryLock(0L, 1024L, false)
that should have worked according to:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6371627
that should have worked according to:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6371627
ASKER
That's exactly why I'm so baffled! I read that bug and a couple of other bugs related to using Long.MAX_VALUE on 64-bit systems could cause problems.
I just ran a couple more tests, using start/end pairs of:
0, 1024
1, 1024
0, 0
All with the same result as above...
I just ran a couple more tests, using start/end pairs of:
0, 1024
1, 1024
0, 0
All with the same result as above...
ASKER
One side note, looks like the system has OpenJDK 1.6.0, so it may be an OpenJDK issue. I'm going to try and do a test on the same OS/Filesystem with regular Java to see what happens.
Try to run java -version from the command line. If it doesn't report correctly, you may have a configuration error.
Expected output:
[/usr/local/etc]$ java -version
openjdk version "1.6.0-internal"
OpenJDK Runtime Environment (build 1.6.0-internal-root_17_mar _2009_11_4 7-b00)
OpenJDK 64-Bit Server VM (build 11.0-b17, mixed mode)
Expected output:
[/usr/local/etc]$ java -version
openjdk version "1.6.0-internal"
OpenJDK Runtime Environment (build 1.6.0-internal-root_17_mar
OpenJDK 64-Bit Server VM (build 11.0-b17, mixed mode)
ASKER
Doing some more testing with different systems found that it is not isolated to OpenJDK, on a different system that is also running OpenJDK I was able to get the FileLock to work. Seems like it is a configuration issue on the system I was doing my initial tests on. Having my SysAdmins take a look to see what's different (they should be identical).
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Bingo, looks like that is the problem. The OpenJDK versions are different.
FileChannel channel = new RandomAccessFile("fileLock
FileLock lock = channel.lock();
lock = channel.tryLock();