Hi Vitaly,

This is unfortunately due to a recent change in IndexWriter ... search
for the recent thread "CorruptIndexException when opening Index during
first commit" on this list.

Normally, if a commit fails for any reason (OS, hardware, JVM crashes)
we simply fall back to the last commit and no intervention is
necessary.

But if that commit was the very first commit ... we used to try to
detect this and treat it as if there were no index present.  This is
the ideal/correct behavior, because "no index present" was in fact the
state of the index before this failed commit.

However that logic was dangerous and would sometimes result in
IndexWriter thinking no index was present when in fact there was one,
when there were transient errors e.g. due to file descriptor
exhaustion.  So to be safe we now throw the CorruptIndexException on
first commit back to the application.

Your workaround sounds good.  Another option instead of the separate
init file, on hitting a CorruptIndexException, might be to list the
directory: if there is only one file, segments_1, then it's a corrupt
first commit and you can recreate the index.

Mike McCandless

http://blog.mikemccandless.com

On Wed, May 29, 2013 at 8:09 PM, Vitaly Funstein <vfunst...@gmail.com> wrote:
> I have encountered a strange issue, that appears to be pretty hard to hit,
> but is still a serious problem when it does occur. It seems that if the JVM
> crashes in a racy fashion with instantiation of IndexWriter, the index may
> be left in an inconsistent state. An attempt to reload such an index on
> restart will result in a CorruptIndexException thrown when calling the
> constructor again.
>
> My idea of a workaround involves the following:
>
> - call commit() immediately after invoking the constructor.
> - create a special init file after the commit to indicate the index was
> created successfully
> - on app startup, check to see if the init file is there; if not, the index
> is corrupt and needs to be recreated.
>
> (The last two already happen in my code)
>
> Is this a valid approach to protect from this sort of race? Is there
> already a built-in mechanism to make constructor fully synchronous wrt
> persisting all the metadata? If not, it seems like there probably should
> be...

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

Reply via email to