Fix for ALF-786: WCM Cluster / Lucene: Searching in staging returns duplicate entries (when concurrently submtting)

- fixed duplication arising from indexing 0-1 and 0-2 against the index for near simultaneous snapshots 
- tracking has not been modified nor has index rebuild - the latest index info from the AVM index is definitive and complete - we do not have to do additional work as we do for DM

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@19898 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Andrew Hind
2010-04-19 14:11:47 +00:00
parent 16c4b49359
commit 0d3f558e11
19 changed files with 1366 additions and 239 deletions

View File

@@ -36,7 +36,7 @@ import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
/**
* Method interceptor for atomic indexing of AVM entries The properties can defined how stores are indexed based on type
* Method interceptor for atomic indexing of AVM entries The properties can defined how stores are indexed based on type
* (as set by Alfresco the Web site management UI) or based on the name of the store. Creates and deletes are indexed
* synchronously. Updates may be asynchronous, synchronous or ignored by the index.
*
@@ -100,14 +100,14 @@ public class AVMSnapShotTriggeredIndexingMethodInterceptor implements MethodInte
{
String store = (String) mi.getArguments()[0];
Object returnValue = mi.proceed();
if (getIndexMode(store) != IndexMode.UNINDEXED)
if (getIndexMode(store) != IndexMode.UNINDEXED)
{
AVMLuceneIndexer avmIndexer = getIndexer(store);
if (avmIndexer != null)
{
avmIndexer.deleteIndex(store, IndexMode.SYNCHRONOUS);
}
AVMLuceneIndexer avmIndexer = getIndexer(store);
if (avmIndexer != null)
{
avmIndexer.deleteIndex(store, IndexMode.SYNCHRONOUS);
}
}
return returnValue;
}
@@ -115,10 +115,10 @@ public class AVMSnapShotTriggeredIndexingMethodInterceptor implements MethodInte
{
String store = (String) mi.getArguments()[0];
Object returnValue = mi.proceed();
if (getIndexMode(store) != IndexMode.UNINDEXED)
{
createIndex(store);
}
if (getIndexMode(store) != IndexMode.UNINDEXED)
{
createIndex(store);
}
return returnValue;
}
else if (mi.getMethod().getName().equals("renameStore"))
@@ -127,24 +127,24 @@ public class AVMSnapShotTriggeredIndexingMethodInterceptor implements MethodInte
String to = (String) mi.getArguments()[1];
Object returnValue = mi.proceed();
int after = avmService.getLatestSnapshotID(to);
if (getIndexMode(from) != IndexMode.UNINDEXED)
if (getIndexMode(from) != IndexMode.UNINDEXED)
{
AVMLuceneIndexer avmIndexer = getIndexer(from);
if (avmIndexer != null)
{
avmIndexer.deleteIndex(from, IndexMode.SYNCHRONOUS);
}
AVMLuceneIndexer avmIndexer = getIndexer(from);
if (avmIndexer != null)
{
avmIndexer.deleteIndex(from, IndexMode.SYNCHRONOUS);
}
}
if (getIndexMode(to) != IndexMode.UNINDEXED)
if (getIndexMode(to) != IndexMode.UNINDEXED)
{
AVMLuceneIndexer avmIndexer = getIndexer(to);
if (avmIndexer != null)
{
avmIndexer.createIndex(to, IndexMode.SYNCHRONOUS);
avmIndexer.index(to, 0, after, getIndexMode(to));
}
AVMLuceneIndexer avmIndexer = getIndexer(to);
if (avmIndexer != null)
{
avmIndexer.createIndex(to, IndexMode.SYNCHRONOUS);
avmIndexer.index(to, 0, after, getIndexMode(to));
}
}
return returnValue;
}
@@ -213,74 +213,76 @@ public class AVMSnapShotTriggeredIndexingMethodInterceptor implements MethodInte
{
this.defaultMode = defaultMode;
}
/**
* Is snapshot triggered indexing enabled
*
* @return true if indexing is enabled for AVM
*/
public boolean isIndexingEnabled()
{
return enableIndexing;
}
/**
* Is snapshot triggered indexing enabled
*
* @return true if indexing is enabled for AVM
*/
public boolean isIndexingEnabled()
{
return enableIndexing;
}
/**
* @param store
* @param before
* @param after
*/
public void indexSnapshot(String store, int before, int after)
{
indexSnapshotImpl(store, before, after);
indexSnapshotImpl(store, before, after);
}
/**
* @param store
* @param after
*/
/**
* @param store
* @param after
*/
public void indexSnapshot(String store, int after)
{
indexSnapshotImpl(store, -1, after);
}
private void indexSnapshotImpl(String store, int before, int after)
{
if (getIndexMode(store) != IndexMode.UNINDEXED)
indexSnapshotImpl(store, -1, after);
}
private void indexSnapshotImpl(String store, int before, int after)
{
if (getIndexMode(store) != IndexMode.UNINDEXED)
{
AVMLuceneIndexer avmIndexer = getIndexer(store);
if (avmIndexer != null)
{
int last = getLastIndexedSnapshot(avmIndexer, store);
if ((last == -1) && (! hasIndexBeenCreated(store)))
{
createIndex(store);
}
avmIndexer.index(store, (before != -1 ? before : last), after, getIndexMode(store));
}
AVMLuceneIndexer avmIndexer = getIndexer(store);
if (avmIndexer != null)
{
int last = getLastIndexedSnapshot(avmIndexer, store);
if ((last == -1) && (! hasIndexBeenCreated(store)))
{
createIndex(store);
}
int from = before != -1 ? before : last;
avmIndexer.index(store, from, after, getIndexMode(store));
}
}
}
/**
* @param store
* @return - the last indexed snapshot
*/
public int getLastIndexedSnapshot(String store)
{
AVMLuceneIndexer avmIndexer = getIndexer(store);
if (avmIndexer != null)
AVMLuceneIndexer avmIndexer = getIndexer(store);
if (avmIndexer != null)
{
return getLastIndexedSnapshot(avmIndexer, store);
return getLastIndexedSnapshot(avmIndexer, store);
}
return -1;
}
private int getLastIndexedSnapshot(AVMLuceneIndexer avmIndexer, String store)
{
return avmIndexer.getLastIndexedSnapshot(store);
}
private int getLastIndexedSnapshot(AVMLuceneIndexer avmIndexer, String store)
{
return avmIndexer.getLastIndexedSnapshot(store);
}
/**
* Is the snapshot applied to the index? Is there an entry for any node that was added OR have all the nodes in the
* transaction been deleted as expected?
@@ -291,8 +293,8 @@ public class AVMSnapShotTriggeredIndexingMethodInterceptor implements MethodInte
*/
public boolean isSnapshotIndexed(String store, int id)
{
AVMLuceneIndexer avmIndexer = getIndexer(store);
if (avmIndexer != null)
AVMLuceneIndexer avmIndexer = getIndexer(store);
if (avmIndexer != null)
{
return avmIndexer.isSnapshotIndexed(store, id);
}
@@ -315,8 +317,8 @@ public class AVMSnapShotTriggeredIndexingMethodInterceptor implements MethodInte
case SYNCHRONOUS:
case ASYNCHRONOUS:
int last = avmService.getLatestSnapshotID(store);
AVMLuceneIndexer avmIndexer = getIndexer(store);
if (avmIndexer != null)
AVMLuceneIndexer avmIndexer = getIndexer(store);
if (avmIndexer != null)
{
avmIndexer.flushPending();
return avmIndexer.isSnapshotSearchable(store, last);
@@ -343,11 +345,11 @@ public class AVMSnapShotTriggeredIndexingMethodInterceptor implements MethodInte
case SYNCHRONOUS:
case ASYNCHRONOUS:
int last = avmService.getLatestSnapshotID(store);
AVMLuceneIndexer avmIndexer = getIndexer(store);
if (avmIndexer != null)
AVMLuceneIndexer avmIndexer = getIndexer(store);
if (avmIndexer != null)
{
avmIndexer.flushPending();
return getLastIndexedSnapshot(avmIndexer, store) == last;
return avmIndexer.isSnapshotIndexed(store, last);
}
return false;
default:
@@ -487,8 +489,8 @@ public class AVMSnapShotTriggeredIndexingMethodInterceptor implements MethodInte
public boolean hasIndexBeenCreated(String store)
{
AVMLuceneIndexer avmIndexer = getIndexer(store);
if (avmIndexer != null)
AVMLuceneIndexer avmIndexer = getIndexer(store);
if (avmIndexer != null)
{
avmIndexer.flushPending();
return avmIndexer.hasIndexBeenCreated(store);
@@ -498,8 +500,8 @@ public class AVMSnapShotTriggeredIndexingMethodInterceptor implements MethodInte
public void createIndex(String store)
{
AVMLuceneIndexer avmIndexer = getIndexer(store);
if (avmIndexer != null)
AVMLuceneIndexer avmIndexer = getIndexer(store);
if (avmIndexer != null)
{
avmIndexer.createIndex(store, IndexMode.SYNCHRONOUS);
}