Hi all,
We are using the last version of lucene (1.9.1), and sometimes we end up
with such error when opening one of the index our application uses:
java.io.FileNotFoundException: [...]/LuceneIndex/_ 46.fnm (No such file
or directory)
at java.io.RandomAccessFile.open(Native Method)
at java.io.RandomAccessFile.<init>(RandomAccessFile.java:204)
at
org.apache.lucene.store.FSIndexInput$Descriptor.<init>(FSDirectory.java:425)
at org.apache.lucene.store.FSIndexInput.<init>(FSDirectory.java:434)
at
org.apache.lucene.store.FSDirectory.openInput(FSDirectory.java:324)
at org.apache.lucene.index.FieldInfos.<init>(FieldInfos.java:56)
at
org.apache.lucene.index.SegmentReader.initialize(SegmentReader.java:144)
at org.apache.lucene.index.SegmentReader.get(SegmentReader.java:129)
at org.apache.lucene.index.SegmentReader.get(SegmentReader.java:110)
at
org.apache.lucene.index.IndexReader$1.doBody(IndexReader.java:154)
at org.apache.lucene.store.Lock$With.run(Lock.java:109)
at org.apache.lucene.index.IndexReader.open(IndexReader.java:143)
at org.apache.lucene.index.IndexReader.open(IndexReader.java:138)
The only solution available in this case being to completely remove and
recreate the index.
I have the "corrupted" index available for testing should you need it.
Apparently this corruption occurs if the JVM has crashed or was shutdown
too violently (kill -9)
I was wondering how a corruption of a lucene index could occur and how
to prevent it, fix it on reopening or in a last resort, detect it to be
able to recreate the index.
Note that I already have that kind of hook in the code for shutdown:
// clean writer reader and searcher correctly
Thread shutdown = new Thread() {
public void run() {
if (reader != null) {
try { reader.close(); }
catch (IOException ex){ /*empty*/ }
reader = null;
}
if (searcher != null) {
try { searcher.close(); }
catch (IOException ex){ /*empty*/ }
searcher = null;
}
}
};
Runtime.getRuntime().addShutdownHook(shutdown);
Or, on opening, code such as:
Directory indexDir = FSDirectory.getDirectory(luceneDir,
!IndexReader.indexExists(luceneDir));
IndexReader.unlock(indexDir); // unlock directory in case of
unproper shutdown
if (!IndexReader.indexExists(luceneDir)) {
writer = new IndexWriter(indexDir, analyzer, true);
writer.close();
}
Any suggestion or remark?
Thanks!
--
Olivier Jaquemet <[EMAIL PROTECTED]>