diff --git a/source/java/org/alfresco/repo/search/impl/lucene/index/IndexInfo.java b/source/java/org/alfresco/repo/search/impl/lucene/index/IndexInfo.java
index 042b2235ac..4d1992d15b 100644
--- a/source/java/org/alfresco/repo/search/impl/lucene/index/IndexInfo.java
+++ b/source/java/org/alfresco/repo/search/impl/lucene/index/IndexInfo.java
@@ -69,11 +69,7 @@ import org.apache.lucene.store.IndexOutput;
import org.apache.lucene.store.RAMDirectory;
/**
- * The information that makes up an index.
- *
- * IndexInfoVersion
- *
- * Repeated information of the form
+ * The information that makes up an index. IndexInfoVersion Repeated information of the form
*
*
- *
- * Merges always take place to new indexes so we can detect merge failure or partial merges. Or we do not know what has merged.
- *
- * Incomplete delete merging does not matter - the overlay would still exist and be treated as such. So a document may be deleted in the index as well as in the applied overlay. It
- * is still correctly deleted.
- *
- * NOTE: Public methods lock as required, the private methods assume that the appropriate locks have been obtained.
- *
- * TODO: Write element status into individual directories. This would be enough for recovery if both index files are lost or corrupted.
- *
- * TODO: Tidy up index status at start up or after some time. How long would you leave a merge to run?
+ * Merges always take place to new indexes so we can detect merge failure or partial merges. Or we do not know what has
+ * merged. Incomplete delete merging does not matter - the overlay would still exist and be treated as such. So a
+ * document may be deleted in the index as well as in the applied overlay. It is still correctly deleted. NOTE: Public
+ * methods lock as required, the private methods assume that the appropriate locks have been obtained. TODO: Write
+ * element status into individual directories. This would be enough for recovery if both index files are lost or
+ * corrupted. TODO: Tidy up index status at start up or after some time. How long would you leave a merge to run?
*
* @author Andy Hind
*/
@@ -155,7 +146,8 @@ public class IndexInfo
private long version = -1;
/**
- * The index entries that make up this index. Map entries are looked up by name. These are maintained in order so document order is maintained.
+ * The index entries that make up this index. Map entries are looked up by name. These are maintained in order so
+ * document order is maintained.
*/
private LinkedHashMap indexEntries = new LinkedHashMap();
@@ -223,13 +215,13 @@ public class IndexInfo
private boolean mergerUseCompoundFile = true;
private int mergerTargetOverlays = 5;
-
+
private long writeLockTimeout = IndexWriter.WRITE_LOCK_TIMEOUT;
-
+
private long commitLockTimeout = IndexWriter.COMMIT_LOCK_TIMEOUT;
-
+
private int maxFieldLength = IndexWriter.DEFAULT_MAX_FIELD_LENGTH;
-
+
private int termIndexInterval = IndexWriter.DEFAULT_TERM_INDEX_INTERVAL;
// TODO: Something to control the maximum number of overlays
@@ -438,16 +430,15 @@ public class IndexInfo
{
cleanerThread = new Thread(cleaner);
cleanerThread.setDaemon(true);
- cleanerThread.setName("Index cleaner thread "+indexDirectory);
+ cleanerThread.setName("Index cleaner thread " + indexDirectory);
cleanerThread.start();
}
-
if (enableMergerThread)
{
mergerThread = new Thread(merger);
mergerThread.setDaemon(true);
- mergerThread.setName("Index merger thread "+indexDirectory);
+ mergerThread.setName("Index merger thread " + indexDirectory);
mergerThread.start();
}
@@ -856,20 +847,20 @@ public class IndexInfo
// TODO: Should use the in memory index but we often end up forcing to disk anyway.
// Is it worth it?
// luceneIndexer.flushPending();
-
- IndexReader deltaReader = buildAndRegisterDeltaReader(id);
+
+ IndexReader deltaReader = buildAndRegisterDeltaReader(id);
IndexReader reader = null;
if (deletions == null || deletions.size() == 0)
{
- reader = new MultiReader(new IndexReader[] {mainIndexReader, deltaReader });
+ reader = new MultiReader(new IndexReader[] { mainIndexReader, deltaReader });
}
else
{
reader = new MultiReader(new IndexReader[] {
- new FilterIndexReaderByNodeRefs2(mainIndexReader, deletions, deleteOnlyNodes), deltaReader });
+ new FilterIndexReaderByNodeRefs2(mainIndexReader, deletions, deleteOnlyNodes), deltaReader });
}
- reader = ReferenceCountingReadOnlyIndexReaderFactory.createReader("MainReader"+id, reader);
- ReferenceCounting refCounting = (ReferenceCounting)reader;
+ reader = ReferenceCountingReadOnlyIndexReaderFactory.createReader("MainReader" + id, reader);
+ ReferenceCounting refCounting = (ReferenceCounting) reader;
refCounting.incrementReferenceCount();
refCounting.setInvalidForReuse();
return reader;
@@ -888,49 +879,61 @@ public class IndexInfo
throw new IndexerException("\"null\" is not a valid identifier for a transaction");
}
final Transition transition = getTransition(state);
- getWriteLock();
+
+ getReadLock();
try
{
- if (transition.requiresFileLock())
+ transition.beforeWithReadLock(id, toDelete, read);
+ releaseReadLock();
+ getWriteLock();
+ try
{
- doWithFileLock(new LockWork