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