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