lucene-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Simon Willnauer (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (LUCENE-5738) NativeLock is release if Lock is closed after obtain failed
Date Thu, 05 Jun 2014 16:50:02 GMT

    [ 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: dev-unsubscribe@lucene.apache.org
For additional commands, e-mail: dev-help@lucene.apache.org


Mime
View raw message