Author: nzamosenchuk
Date: 2012-03-30 03:40:12 -0400 (Fri, 30 Mar 2012)
New Revision: 5991
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/AbstractIndex.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/CommittableIndexReader.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/MultiIndex.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/OfflinePersistentIndex.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/PersistentIndex.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/VolatileIndex.java
Log:
EXOJCR-1796 : apply patch from JCR-1727
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/AbstractIndex.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/AbstractIndex.java 2012-03-30
06:17:55 UTC (rev 5990)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/AbstractIndex.java 2012-03-30
07:40:12 UTC (rev 5991)
@@ -26,6 +26,8 @@
import org.apache.lucene.search.Similarity;
import org.apache.lucene.store.Directory;
import org.apache.lucene.util.Version;
+import org.exoplatform.services.jcr.impl.core.query.IndexerIoMode;
+import org.exoplatform.services.jcr.impl.core.query.IndexerIoModeHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -100,6 +102,8 @@
*/
private boolean isExisting;
+ protected final IndexerIoModeHandler modeHandler;
+
/**
* Constructs an index with an <code>analyzer</code> and a
* <code>directory</code>.
@@ -112,13 +116,14 @@
* <code>null</code>.
* @throws IOException if the index cannot be initialized.
*/
- AbstractIndex(final Analyzer analyzer, Similarity similarity, final Directory
directory, DocNumberCache cache)
- throws IOException
+ AbstractIndex(final Analyzer analyzer, Similarity similarity, final Directory
directory, DocNumberCache cache,
+ IndexerIoModeHandler modeHandler) throws IOException
{
this.analyzer = analyzer;
this.similarity = similarity;
this.directory = directory;
this.cache = cache;
+ this.modeHandler = modeHandler;
AbstractIndex.this.isExisting = IndexReader.indexExists(directory);
@@ -232,11 +237,18 @@
log.debug("closing IndexWriter.");
indexWriter = null;
}
-
+
if (indexReader == null || !indexReader.isCurrent())
{
IndexReader reader = IndexReader.open(getDirectory(), null, false,
termInfosIndexDivisor);
- indexReader = new CommittableIndexReader(reader);
+ // if modeHandler != null and mode==READ_ONLY, then reader should be with
transient deleteions.
+ // This is used to transiently update reader in clustered environment when some
documents have
+ // been deleted. If index reader not null and already contains some transient
deletions, but it
+ // is no more current, it will be re-created loosing deletions. They will
already be applied by
+ // coordinator node in the cluster. And there is no need to inject them into the
new reader
+
+ indexReader =
+ new CommittableIndexReader(reader, modeHandler != null &&
modeHandler.getMode() == IndexerIoMode.READ_ONLY);
}
return indexReader;
}
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/CommittableIndexReader.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/CommittableIndexReader.java 2012-03-30
06:17:55 UTC (rev 5990)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/CommittableIndexReader.java 2012-03-30
07:40:12 UTC (rev 5991)
@@ -16,12 +16,16 @@
*/
package org.exoplatform.services.jcr.impl.core.query.lucene;
-import java.io.IOException;
-
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.FilterIndexReader;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.StaleReaderException;
+import org.apache.lucene.store.LockObtainFailedException;
+import java.io.IOException;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
+
/**
* Wraps an <code>IndexReader</code> and allows to commit changes without
* closing the reader.
@@ -36,13 +40,28 @@
private volatile long modCount;
/**
+ * If reader is created with flag transientDeletions, then reader
+ * deleted documents are stored in the memory buffer and not applied to underlying
+ * index reader.
+ */
+ private final boolean transientDeletions;
+
+ private final Set<Integer> deletedDocs;
+
+ /**
* Creates a new <code>CommittableIndexReader</code> based on
<code>in</code>.
*
* @param in the <code>IndexReader</code> to wrap.
+ * @param transientDeletions If reader is created with flag transientDeletions, then
reader
+ * deleted documents are stored in the memory buffer and not applied to
underlying
+ * index reader.
*/
- CommittableIndexReader(IndexReader in) {
+ CommittableIndexReader(IndexReader in, boolean transientDeletions) {
super(in);
modCount = in.getVersion();
+ this.transientDeletions = transientDeletions;
+ // no need to initialize Set if transientDeletions = false
+ this.deletedDocs = transientDeletions? new CopyOnWriteArraySet<Integer>() :
null;
}
//------------------------< FilterIndexReader >-----------------------------
@@ -57,6 +76,36 @@
modCount++;
}
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void deleteDocument(int docNum) throws StaleReaderException,
CorruptIndexException,
+ LockObtainFailedException, IOException {
+ // skip acquiring write lock
+ if (transientDeletions)
+ {
+ deletedDocs.add(docNum);
+ modCount++; // doDelete won't be executed, so incrementing modCount
+ }
+ else
+ {
+ super.deleteDocument(docNum);
+ }
+ }
+
+ @Override
+ public boolean isDeleted(int n) {
+ if (transientDeletions)
+ {
+ return deletedDocs.contains(n);
+ }
+ else
+ {
+ return super.isDeleted(n);
+ }
+ }
+
//------------------------< additional methods >----------------------------
/**
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/MultiIndex.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/MultiIndex.java 2012-03-30
06:17:55 UTC (rev 5990)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/MultiIndex.java 2012-03-30
07:40:12 UTC (rev 5991)
@@ -335,7 +335,8 @@
continue;
}
PersistentIndex index =
- new PersistentIndex(name, handler.getTextAnalyzer(), handler.getSimilarity(),
cache, directoryManager);
+ new PersistentIndex(name, handler.getTextAnalyzer(), handler.getSimilarity(),
cache, directoryManager,
+ modeHandler);
index.setMaxFieldLength(handler.getMaxFieldLength());
index.setUseCompoundFile(handler.getUseCompoundFile());
index.setTermInfosIndexDivisor(handler.getTermInfosIndexDivisor());
@@ -722,7 +723,24 @@
for (Iterator<String> it = remove.iterator(); it.hasNext();)
{
Term idTerm = new Term(FieldNames.UUID, it.next());
- volatileIndex.removeDocument(idTerm);
+ int num = volatileIndex.removeDocument(idTerm);
+ if (num == 0)
+ {
+ for (int i = indexes.size() - 1; i >= 0; i--)
+ {
+ // only look in registered indexes
+ PersistentIndex idx = indexes.get(i);
+ if (indexNames.contains(idx.getName()))
+ {
+ num = idx.removeDocument(idTerm);
+ if (num > 0)
+ {
+ break;
+ }
+ }
+ }
+ }
+
}
// try to avoid getting index reader for each doc
@@ -1156,7 +1174,8 @@
try
{
index =
- new PersistentIndex(indexName, handler.getTextAnalyzer(),
handler.getSimilarity(), cache, directoryManager);
+ new PersistentIndex(indexName, handler.getTextAnalyzer(),
handler.getSimilarity(), cache, directoryManager,
+ modeHandler);
}
catch (IOException e)
{
@@ -3388,7 +3407,8 @@
continue;
}
PersistentIndex index =
- new PersistentIndex(name, handler.getTextAnalyzer(),
handler.getSimilarity(), cache, directoryManager);
+ new PersistentIndex(name, handler.getTextAnalyzer(),
handler.getSimilarity(), cache, directoryManager,
+ modeHandler);
index.setMaxFieldLength(handler.getMaxFieldLength());
index.setUseCompoundFile(handler.getUseCompoundFile());
index.setTermInfosIndexDivisor(handler.getTermInfosIndexDivisor());
@@ -3488,7 +3508,8 @@
merger = null;
}
offlineIndex =
- new OfflinePersistentIndex(handler.getTextAnalyzer(),
handler.getSimilarity(), cache, directoryManager);
+ new OfflinePersistentIndex(handler.getTextAnalyzer(),
handler.getSimilarity(), cache, directoryManager,
+ modeHandler);
if (modeHandler.getMode() == IndexerIoMode.READ_WRITE)
{
flush();
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/OfflinePersistentIndex.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/OfflinePersistentIndex.java 2012-03-30
06:17:55 UTC (rev 5990)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/OfflinePersistentIndex.java 2012-03-30
07:40:12 UTC (rev 5991)
@@ -22,6 +22,7 @@
import org.apache.lucene.document.Document;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.Similarity;
+import org.exoplatform.services.jcr.impl.core.query.IndexerIoModeHandler;
import org.exoplatform.services.jcr.impl.core.query.lucene.directory.DirectoryManager;
import java.io.IOException;
@@ -55,9 +56,9 @@
* index.
*/
OfflinePersistentIndex(Analyzer analyzer, Similarity similarity, DocNumberCache
cache,
- DirectoryManager directoryManager) throws IOException
+ DirectoryManager directoryManager, IndexerIoModeHandler modeHandler) throws
IOException
{
- super(NAME, analyzer, similarity, cache, directoryManager);
+ super(NAME, analyzer, similarity, cache, directoryManager, modeHandler);
this.processedIDs = new ArrayList<String>();
}
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/PersistentIndex.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/PersistentIndex.java 2012-03-30
06:17:55 UTC (rev 5990)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/PersistentIndex.java 2012-03-30
07:40:12 UTC (rev 5991)
@@ -23,6 +23,7 @@
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.IndexInput;
import org.apache.lucene.store.IndexOutput;
+import org.exoplatform.services.jcr.impl.core.query.IndexerIoModeHandler;
import org.exoplatform.services.jcr.impl.core.query.lucene.directory.DirectoryManager;
import java.io.IOException;
@@ -55,9 +56,9 @@
* index.
*/
PersistentIndex(String name, Analyzer analyzer, Similarity similarity, DocNumberCache
cache,
- final DirectoryManager directoryManager) throws IOException
+ final DirectoryManager directoryManager, IndexerIoModeHandler modeHandler) throws
IOException
{
- super(analyzer, similarity, directoryManager.getDirectory(name), cache);
+ super(analyzer, similarity, directoryManager.getDirectory(name), cache,
modeHandler);
this.name = name;
if (isExisting())
{
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/VolatileIndex.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/VolatileIndex.java 2012-03-30
06:17:55 UTC (rev 5990)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/VolatileIndex.java 2012-03-30
07:40:12 UTC (rev 5991)
@@ -61,7 +61,7 @@
*/
VolatileIndex(Analyzer analyzer, Similarity similarity) throws IOException
{
- super(analyzer, similarity, new RAMDirectory(), null);
+ super(analyzer, similarity, new RAMDirectory(), null, null);
}
/**