mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
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:
@@ -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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user