[ https://issues.apache.org/jira/browse/LUCENE-5738?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14019417#comment-14019417 ]
Richard Boulton commented on LUCENE-5738: ----------------------------------------- In case it wasn't clear in my previous comment, the problem is that when you try to obtain a lock on a file already locked by the same process, you open and then close a second file descriptor on the file, and when that file descriptor is closed, the lock is removed by the OS. Note this from the FileLock documentation (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/nio/channels/FileLock.java#28 ) "On some systems, closing a channel releases all locks held by the Java virtual machine on the underlying file regardless of whether the locks were acquired via that channel or via another channel open on the same file. It is strongly recommended that, within a program, a unique channel be used to acquire all locks on any given file." > 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 > Assignee: 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-unsubscr...@lucene.apache.org For additional commands, e-mail: dev-h...@lucene.apache.org