Author: nzamosenchuk
Date: 2011-01-26 03:25:40 -0500 (Wed, 26 Jan 2011)
New Revision: 3886
Modified:
jcr/branches/1.14-IMPR/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/IndexerSingletonStoreCacheLoader.java
jcr/branches/1.14-IMPR/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/MultiIndex.java
Log:
EXOJCR-1144 : check added, if node should be indexed into volatile or not.
Modified:
jcr/branches/1.14-IMPR/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/IndexerSingletonStoreCacheLoader.java
===================================================================
---
jcr/branches/1.14-IMPR/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/IndexerSingletonStoreCacheLoader.java 2011-01-26
07:47:25 UTC (rev 3885)
+++
jcr/branches/1.14-IMPR/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/IndexerSingletonStoreCacheLoader.java 2011-01-26
08:25:40 UTC (rev 3886)
@@ -134,7 +134,8 @@
public Object put(Fqn name, Object key, Object value) throws Exception
{
// delegating call to underlying cache loader, skipping SingletonStore cache
loader.
- // Later SingletonStore should completely be removed
+ // this is used to deliver lists to non-coordinator nodes, since the do the
indexing into
+ // volatile index
return getCacheLoader().put(name, key, value);
}
Modified:
jcr/branches/1.14-IMPR/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/MultiIndex.java
===================================================================
---
jcr/branches/1.14-IMPR/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/MultiIndex.java 2011-01-26
07:47:25 UTC (rev 3885)
+++
jcr/branches/1.14-IMPR/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/MultiIndex.java 2011-01-26
08:25:40 UTC (rev 3886)
@@ -19,6 +19,7 @@
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
+import org.apache.lucene.index.TermDocs;
import org.apache.lucene.store.Directory;
import org.exoplatform.services.jcr.dataflow.ItemDataConsumer;
import org.exoplatform.services.jcr.datamodel.ItemData;
@@ -49,7 +50,6 @@
import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;
-import java.util.concurrent.atomic.AtomicInteger;
import javax.jcr.ItemNotFoundException;
import javax.jcr.RepositoryException;
@@ -477,34 +477,86 @@
log.warn("unable to prepare index reader " + "for
queries during update", e);
}
}
-
+ ReadOnlyIndexReader lastIndexReader = null;
try
{
- long transactionId = nextTransactionId++;
- new Start(transactionId).execute(MultiIndex.this);
-
for (Iterator it = remove.iterator(); it.hasNext();)
{
- new DeleteNode(transactionId,
(String)it.next()).execute(MultiIndex.this);
+ Term idTerm = new Term(FieldNames.UUID, (String)it.next());
+ volatileIndex.removeDocument(idTerm);
}
+
+ // try to avoid getting index reader for each doc
+ int lastIndexReaderId = indexes.size() - 1;
+ // check, index list can be empty
+ lastIndexReader =
+ (lastIndexReaderId >= 0) ?
((PersistentIndex)indexes.get(lastIndexReaderId)).getReadOnlyIndexReader()
+ : null;
for (Iterator it = add.iterator(); it.hasNext();)
{
Document doc = (Document)it.next();
if (doc != null)
{
- new AddNode(transactionId, doc).execute(MultiIndex.this);
- // reset volatile index if needed
- if (volatileIndex.getRamSizeInBytes() >=
handler.getMaxVolatileIndexSize())
+ // check if this item should be placed in own volatile index
+ // usually it must be indexed, but exception if it exists in
persisted index
+ boolean addDoc = true;
+
+ // make this check safe if something goes wrong
+ String uuid = doc.get(FieldNames.UUID);
+ // if remove contains uuid, node should be re-indexed
+ // if not, than should be checked if node present in the last
persisted index
+ if (!remove.contains(uuid))
{
- // not to get out of memory
- resetVolatileIndex();
+ // if index list changed, get the reader on the latest index
+ // or if index reader is not current
+ if (lastIndexReaderId != indexes.size() - 1
+ || (lastIndexReader != null &&
!lastIndexReader.isCurrent()))
+ {
+ // safe release reader
+ if (lastIndexReader != null)
+ {
+ lastIndexReader.release();
+ }
+ lastIndexReaderId = indexes.size() - 1;
+ lastIndexReader =
((PersistentIndex)indexes.get(lastIndexReaderId)).getReadOnlyIndexReader();
+ }
+ // if indexReader exists (it is possible that no persisted
indexes exists on start)
+ if (lastIndexReader != null)
+ {
+ try
+ {
+ // reader from resisted index should be
+ TermDocs termDocs = lastIndexReader.termDocs(new
Term(FieldNames.UUID, uuid));
+ // node should be indexed if not found in persistent index
+ addDoc = termDocs == null;
+ }
+ catch (Exception e)
+ {
+ log.debug("Some exception occured, during index
check");
+ }
+ }
}
+
+ if (addDoc)
+ {
+ volatileIndex.addDocuments(new Document[]{doc});
+ // reset volatile index if needed
+ if (volatileIndex.getRamSizeInBytes() >=
handler.getMaxVolatileIndexSize())
+ {
+ // to avoid out of memory
+ resetVolatileIndex();
+ }
+ }
}
}
- new Commit(transactionId).execute(MultiIndex.this);
}
finally
{
+ // don't forget to release a reader anyway
+ if (lastIndexReader != null)
+ {
+ lastIndexReader.release();
+ }
synchronized (updateMonitor)
{
releaseMultiReader();
Show replies by date