Sneaky!  Can you open a bug?

Mike

On Wed, Dec 2, 2009 at 10:23 AM, Shai Erera <ser...@gmail.com> wrote:
> 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
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: java-dev-unsubscr...@lucene.apache.org
For additional commands, e-mail: java-dev-h...@lucene.apache.org

Reply via email to