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;
}