Index: src/main/java/org/apache/jackrabbit/core/query/lucene/CachingIndexReader.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/query/lucene/CachingIndexReader.java (revision 1181715) +++ src/main/java/org/apache/jackrabbit/core/query/lucene/CachingIndexReader.java (working copy) @@ -23,12 +23,15 @@ import org.apache.lucene.index.Term; import org.apache.lucene.index.TermDocs; import org.apache.lucene.index.TermEnum; +import org.apache.lucene.store.IndexInput; +import org.apache.lucene.store.IndexOutput; import org.apache.lucene.index.CorruptIndexException; import org.apache.jackrabbit.core.id.NodeId; import org.apache.commons.collections.map.LRUMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.FileNotFoundException; import java.io.IOException; import java.util.Arrays; import java.util.BitSet; @@ -108,6 +111,11 @@ private final TermDocsCache termDocsCache; /** + * The {@link #inSegmentParents} is persisted using this filename. + */ + private static final String FILE_CACHE_NAME_ARRAY = "inSegmentParents"; + + /** * Creates a new CachingIndexReader based on * delegatee * @@ -139,7 +147,9 @@ } this.cacheInitializer = new CacheInitializer(delegatee); if (initCache) { - cacheInitializer.run(); + if (!load()) { + cacheInitializer.run(); + } } // limit cache to 1% of maxDoc(), but at least 10. this.docNumber2id = Collections.synchronizedMap( @@ -322,6 +332,36 @@ return termDocsCache.termDocs(term); } + public void save() throws IOException { + IndexOutput io = cacheInitializer.reader.directory().createOutput( + FILE_CACHE_NAME_ARRAY); + + for (int parent : inSegmentParents) { + io.writeInt(parent); + } + io.close(); + } + + private boolean load() { + try { + IndexInput ii = cacheInitializer.reader.directory().openInput( + FILE_CACHE_NAME_ARRAY); + try { + for (int i = 0; i < this.inSegmentParents.length; i++) { + this.inSegmentParents[i] = ii.readInt(); + } + return true; + } finally { + ii.close(); + } + } catch (FileNotFoundException ignore) { + } catch (IOException ignore) { + log.warn("Saved state of CachingIndexReader corrupt", ignore); + } + + return false; + } + /** * {@inheritDoc} */ @@ -463,6 +503,7 @@ if (docs.isEmpty()) { // no more nodes to initialize + save(); break; }