You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by al...@apache.org on 2012/06/15 11:29:22 UTC
svn commit: r1350552 - in
/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene:
AbstractIndex.java CommittableIndexReader.java ReadOnlyIndexReader.java
Author: alexparvulescu
Date: Fri Jun 15 09:29:21 2012
New Revision: 1350552
URL: http://svn.apache.org/viewvc?rev=1350552&view=rev
Log:
JCR-3319 Improve performance of repository updates - tweak index 'deletes' creation
Modified:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/AbstractIndex.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/CommittableIndexReader.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/ReadOnlyIndexReader.java
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/AbstractIndex.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/AbstractIndex.java?rev=1350552&r1=1350551&r2=1350552&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/AbstractIndex.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/AbstractIndex.java Fri Jun 15 09:29:21 2012
@@ -21,7 +21,6 @@ import java.io.OutputStream;
import java.io.PrintStream;
import java.io.StringReader;
import java.util.ArrayList;
-import java.util.BitSet;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CountDownLatch;
@@ -307,13 +306,6 @@ abstract class AbstractIndex {
}
}
// if we get here there is no up-to-date read-only reader
- // capture snapshot of deleted documents
- BitSet deleted = new BitSet(modifiableReader.maxDoc());
- for (int i = 0; i < modifiableReader.maxDoc(); i++) {
- if (modifiableReader.isDeleted(i)) {
- deleted.set(i);
- }
- }
if (sharedReader == null) {
// create new shared reader
IndexReader reader = IndexReader.open(getDirectory(), null, true, termInfosIndexDivisor);
@@ -321,7 +313,8 @@ abstract class AbstractIndex {
reader, cache, initCache);
sharedReader = new SharedIndexReader(cr);
}
- readOnlyReader = new ReadOnlyIndexReader(sharedReader, deleted, modCount);
+ readOnlyReader = new ReadOnlyIndexReader(sharedReader,
+ modifiableReader.getDeletedDocs(), modCount);
readOnlyReader.acquire();
return readOnlyReader;
}
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/CommittableIndexReader.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/CommittableIndexReader.java?rev=1350552&r1=1350551&r2=1350552&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/CommittableIndexReader.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/CommittableIndexReader.java Fri Jun 15 09:29:21 2012
@@ -16,11 +16,17 @@
*/
package org.apache.jackrabbit.core.query.lucene;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.BitSet;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.FilterIndexReader;
import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.index.CorruptIndexException;
-
-import java.io.IOException;
/**
* Wraps an <code>IndexReader</code> and allows to commit changes without
@@ -29,6 +35,11 @@ import java.io.IOException;
class CommittableIndexReader extends FilterIndexReader {
/**
+ * The maximum size of the delete history.
+ */
+ private static final int DELETE_HISTORY_SIZE = 1000;
+
+ /**
* A modification count on this index reader. Initialized with
* {@link IndexReader#getVersion()} and incremented with every call to
* {@link #doDelete(int)}.
@@ -36,6 +47,16 @@ class CommittableIndexReader extends Fil
private volatile long modCount;
/**
+ * The history of the most recent deletes.
+ */
+ private final List<Integer> deleteHistory = new LinkedList<Integer>();
+
+ /**
+ * The deleted docs for this index reader.
+ */
+ private final BitSet deletedDocs = new BitSet();
+
+ /**
* Creates a new <code>CommittableIndexReader</code> based on <code>in</code>.
*
* @param in the <code>IndexReader</code> to wrap.
@@ -43,6 +64,12 @@ class CommittableIndexReader extends Fil
CommittableIndexReader(IndexReader in) {
super(in);
modCount = in.getVersion();
+ int maxDocs = in.maxDoc();
+ for (int i = 0; i < maxDocs; i++) {
+ if (in.isDeleted(i)) {
+ deletedDocs.set(i);
+ }
+ }
}
//------------------------< FilterIndexReader >-----------------------------
@@ -55,6 +82,11 @@ class CommittableIndexReader extends Fil
protected void doDelete(int n) throws CorruptIndexException, IOException {
super.doDelete(n);
modCount++;
+ if (deleteHistory.size() >= DELETE_HISTORY_SIZE) {
+ deleteHistory.remove(0);
+ }
+ deleteHistory.add(n);
+ deletedDocs.set(n);
}
//------------------------< additional methods >----------------------------
@@ -65,4 +97,44 @@ class CommittableIndexReader extends Fil
long getModificationCount() {
return modCount;
}
+
+ /**
+ * Returns the document numbers of deleted nodes since the given
+ * <code>modCount</code>.
+ *
+ * @param modCount a modification count.
+ * @return document numbers of deleted nodes or <code>null</code> if this
+ * index reader cannot provide those document number. e.g. modCount
+ * is too far back in the past.
+ * @throws IllegalArgumentException if <code>modCount</code> is larger than
+ * {@link #getModificationCount()}.
+ */
+ Collection<Integer> getDeletedSince(long modCount)
+ throws IllegalArgumentException {
+ if (modCount > this.modCount) {
+ throw new IllegalArgumentException("modCount: "
+ + modCount + " > " + this.modCount);
+ }
+ if (modCount == this.modCount) {
+ return Collections.emptyList();
+ }
+ long num = this.modCount - modCount;
+ if (num > deleteHistory.size()) {
+ return null;
+ }
+ List<Integer> deletes = new ArrayList<Integer>((int) num);
+ for (Integer d : deleteHistory.subList((int) (deleteHistory.size() - num),
+ deleteHistory.size())) {
+ deletes.add(d);
+ }
+ return deletes;
+ }
+
+ /**
+ * Returns a copy of the deleted documents BitSet.
+ * @return the deleted documents of this index reader.
+ */
+ BitSet getDeletedDocs() {
+ return (BitSet) deletedDocs.clone();
+ }
}
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/ReadOnlyIndexReader.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/ReadOnlyIndexReader.java?rev=1350552&r1=1350551&r2=1350552&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/ReadOnlyIndexReader.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/ReadOnlyIndexReader.java Fri Jun 15 09:29:21 2012
@@ -22,6 +22,7 @@ import org.apache.lucene.index.TermPosit
import java.io.IOException;
import java.util.BitSet;
+import java.util.Collection;
import java.util.Map;
/**
@@ -36,7 +37,7 @@ class ReadOnlyIndexReader extends RefCou
* The deleted documents as initially read from the IndexReader passed
* in the constructor of this class.
*/
- private final BitSet deleted;
+ private BitSet deleted;
/**
* The version of the index reader from where the deleted BitSet was
@@ -93,10 +94,14 @@ class ReadOnlyIndexReader extends RefCou
* info.
*/
void updateDeletedDocs(CommittableIndexReader reader) {
- int maxDoc = reader.maxDoc();
- for (int i = 0; i < maxDoc; i++) {
- if (reader.isDeleted(i)) {
- deleted.set(i);
+ Collection<Integer> deletes = reader.getDeletedSince(deletedDocsVersion);
+ if (deletes == null) {
+ // full update needed
+ this.deleted = reader.getDeletedDocs();
+ } else {
+ // incremental update
+ for (Integer d : deletes) {
+ deleted.set(d);
}
}
deletedDocsVersion = reader.getModificationCount();