[
https://issues.apache.org/jira/browse/LUCENE-5738?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14018948#comment-14018948
]
Simon Willnauer commented on LUCENE-5738:
-----------------------------------------
Ok this gets more funky... I modified the test since it is not exactly what I
was seeing....
{code}
public static void main(String[] foo) throws IOException, InterruptedException
{
NativeFSLockFactory lockFactory = new NativeFSLockFactory(new
File("/tmp"));
Lock lock = lockFactory.makeLock("LOCK");
if (lock.obtain()) {
System.out.println("OBTAINED");
} else {
System.out.println("FAILED");
}
lock = lockFactory.makeLock("LOCK"); // <<<<==== this is a new lock
// here when we call obtain we run into an OverlappingFileLockException
// this exception closes the file channel and that causes the
// internal file lock table to be invalidated. This essentially
releases the W lock of the first descriptor
if (lock.obtain()) {
System.out.println("OBTAINED AGAIN");
} else {
System.out.println("FAILED on Second");
}
Thread.sleep(Integer.MAX_VALUE);
}
{code}
it seems that the FileChannel release all locks if it is closed.. There is some
funky code in FileChannelImpl.java I would't be suprised if it has bugs
> NativeLock is release if Lock is closed after obtain failed
> -----------------------------------------------------------
>
> Key: LUCENE-5738
> URL: https://issues.apache.org/jira/browse/LUCENE-5738
> Project: Lucene - Core
> Issue Type: Bug
> Affects Versions: 4.8.1
> Reporter: Simon Willnauer
> Fix For: 4.9, 5.0
>
>
> if you obtain the NativeFSLock and try to obtain it again in the same JVM and
> close if if it fails another process will be able to obtain it. This is
> pretty trappy though. If you execute the main class twice the problem becomes
> pretty obvious.
> {noformat}
> import org.apache.lucene.store.Lock;
> import org.apache.lucene.store.NativeFSLockFactory;
> import java.io.File;
> import java.io.IOException;
> public class TestLock {
> public static void main(String[] foo) throws IOException,
> InterruptedException {
> NativeFSLockFactory lockFactory = new NativeFSLockFactory(new
> File("/tmp"));
> Lock lock = lockFactory.makeLock("LOCK");
> if (lock.obtain()) {
> System.out.println("OBTAINED");
> } else {
> lock.close();
> System.out.println("FAILED");
> }
> // try it again and close it if it fails
> lock = lockFactory.makeLock("LOCK"); // <<<<==== this is a new lock
> if (lock.obtain()) {
> System.out.println("OBTAINED AGAIN");
> } else {
> lock.close(); // <<<<==== this releases the lock we obtained
> System.out.println("FAILED on Second");
> }
> Thread.sleep(Integer.MAX_VALUE);
> }
> }
> {noformat}
--
This message was sent by Atlassian JIRA
(v6.2#6252)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]