It seems that only NativeFSLock has a problem here. The rest either attempt
to delete the file or do something else. Only NativeFSLock does not do
anything, if its 'lock' instance in null. Which will always be the case,
because NativeFSLockFactory.makeLock always returns a new NativeFSLock. So
unless someone calls obtain(), the nothing will happen upon calling
release().

Shai

On Wed, Dec 2, 2009 at 4:51 PM, Shai Erera <ser...@gmail.com> wrote:

> Hi
>
> Not sure if I'm using it right, so apologize in advance if I posted to the
> wrong list. I tried to use IndexWriter.unlock, as according to my
> understanding, it should unlock a directory if it's locked, and that's by
> deleting the lock file. But it doesn't work. Here's a short test:
>
> Directory dir = FSDirectory.open(indexDir, new
> NativeFSLockFactory(indexDir));
> try {
>   new IndexWriter(dir, null, MaxFieldLength.UNLIMITED);
> } catch (Exception e) {
>   IndexWriter.unlock(dir);
>   new IndexWriter(dir, null, MaxFieldLength.UNLIMITED);
> }
>
> I run it two times in debug mode. The first, I stop after the first new
> IndexWriter(), so the lock is kept held. The second time I run this, I reach
> the Exception clause (as expected), but then even after I invoke unlock(), I
> get the exception:
>
> Exception in thread "main"
> org.apache.lucene.store.LockObtainFailedException: Lock obtain timed out:
> NativeFSLock@<dir>\write.lock
>     at org.apache.lucene.store.Lock.obtain(Lock.java:84)
>     at org.apache.lucene.index.IndexWriter.init(IndexWriter.java:1044)
>     at org.apache.lucene.index.IndexWriter.init(IndexWriter.java:1019)
>     at org.apache.lucene.index.IndexWriter.<init>(IndexWriter.java:890)
>     at JustTest.main(JustTest.java:25) --> that's the line of the new
> IndexWriter inside the catch clause
>
> So first, what IndexWriter.unlock does is call directory.makeLock() and
> then release. But NativeFSLock's release() does not do anything, because the
> lock wasn't obtained yet. I think unlock() should have:
> Lock l = dir.makeLock(indexDir);
> l.obtain();
> l.release();
>
> That way, unlock() would have notified a failure, which is IMO the right
> behavior here. If no one uses the index, opening a new IndexWriter, even if
> the lock exists, will succeed, so no need to call unlock() at all. Which
> brings the question what's the use of unlock(), unless it will fail loudly
> if it does not succeed to delete the lock.
>
> Shai
>

Reply via email to