Fix for ALF-2329: Parameter to automatically remove the existing index directories before doing a FULL re-index

- full reindex now deletes any existing DM and AVM indexes
- the index directory is tidied up int eh backround which may take some time
- includes fix to check async snapshots are in the index (it was checking sync twice ...)

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@19922 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Andrew Hind
2010-04-20 16:51:17 +00:00
parent d74f934789
commit 2861feadb6
10 changed files with 160 additions and 1 deletions

View File

@@ -287,6 +287,16 @@ public class AVMFullIndexRecoveryComponent extends AbstractReindexComponent
else if (mode == RecoveryMode.FULL)
{
logger.info(" Rebuilding index for " + store);
// delete existing index
RetryingTransactionCallback<Void> deleteWork = new RetryingTransactionCallback<Void>()
{
public Void execute() throws Exception
{
avmSnapShotTriggeredIndexingMethodInterceptor.deleteIndex(store);
return null;
}
};
transactionService.getRetryingTransactionHelper().doInTransaction(deleteWork, true, true);
}
final int latest = avmService.getLatestSnapshotID(store);

View File

@@ -32,6 +32,7 @@ import org.alfresco.repo.node.index.IndexTransactionTracker.IndexTransactionTrac
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.cmr.repository.NodeRef.Status;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -318,6 +319,21 @@ public class FullIndexRecoveryComponent extends AbstractReindexComponent
private static final int MAX_TRANSACTIONS_PER_ITERATION = 1000;
private void performFullRecovery()
{
RetryingTransactionCallback<Void> deleteWork = new RetryingTransactionCallback<Void>()
{
public Void execute() throws Exception
{
// delete stores
for(StoreRef storeRef : nodeService.getStores())
{
indexer.deleteIndex(storeRef);
}
return null;
}
};
transactionService.getRetryingTransactionHelper().doInTransaction(deleteWork, true, true);
int txnCount = nodeDaoService.getTransactionCount();
// starting
String msgStart = I18NUtil.getMessage(MSG_RECOVERY_STARTING, txnCount);

View File

@@ -519,4 +519,14 @@ public class AVMSnapShotTriggeredIndexingMethodInterceptor implements MethodInte
return null;
}
public void deleteIndex(String store)
{
StoreRef storeRef = AVMNodeConverter.ToStoreRef(store);
Indexer indexer = indexerAndSearcher.getIndexer(storeRef);
if (indexer instanceof AVMLuceneIndexer)
{
AVMLuceneIndexer avmIndexer = (AVMLuceneIndexer) indexer;
avmIndexer.deleteIndex(storeRef);
}
}
}

View File

@@ -20,6 +20,7 @@ package org.alfresco.repo.search;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.StoreRef;
/**
* This interface abstracts how indexing is used from within the node service
@@ -102,6 +103,12 @@ public interface Indexer
*/
public void deleteChildRelationship(ChildAssociationRef relationshipRef);
/**
* Delete the index for a store
* @param storeRef
*/
public void deleteIndex(StoreRef storeRef);

View File

@@ -21,6 +21,7 @@ package org.alfresco.repo.search;
import org.alfresco.repo.service.StoreRedirectorProxyFactory;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.StoreRef;
import org.springframework.extensions.surf.util.AbstractLifecycleBean;
import org.springframework.context.ApplicationEvent;
@@ -102,4 +103,13 @@ public class IndexerComponent extends AbstractLifecycleBean implements Indexer
indexer.deleteChildRelationship(relationshipRef);
}
/* (non-Javadoc)
* @see org.alfresco.repo.search.Indexer#deleteIndex(org.alfresco.service.cmr.repository.StoreRef)
*/
public void deleteIndex(StoreRef storeRef)
{
Indexer indexer = indexerAndSearcherFactory.getIndexer(storeRef);
indexer.deleteIndex(storeRef);
}
}

View File

@@ -21,6 +21,7 @@ package org.alfresco.repo.search.impl;
import org.alfresco.repo.search.Indexer;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.StoreRef;
/**
* A no action indexer - the indexing is done automatically along with
@@ -64,4 +65,12 @@ public class NoActionIndexer implements Indexer
return;
}
/* (non-Javadoc)
* @see org.alfresco.repo.search.Indexer#deleteIndex(org.alfresco.service.cmr.repository.StoreRef)
*/
public void deleteIndex(StoreRef storeRef)
{
return;
}
}

View File

@@ -1697,4 +1697,12 @@ public class ADMLuceneIndexerImpl extends AbstractLuceneIndexerImpl<NodeRef> imp
}
/* (non-Javadoc)
* @see org.alfresco.repo.search.Indexer#deleteIndex(org.alfresco.service.cmr.repository.StoreRef)
*/
public void deleteIndex(StoreRef storeRef)
{
deleteIndex();
}
}

View File

@@ -1588,7 +1588,7 @@ public class AVMLuceneIndexerImpl extends AbstractLuceneIndexerImpl<String> impl
}
else
{
return isSynchronousSnapshotPresent(store, id) || isSynchronousSnapshotPresent(store, id);
return isSynchronousSnapshotPresent(store, id) || isAsynchronousSnapshotPresent(store, id);
}
}
@@ -2106,4 +2106,13 @@ public class AVMLuceneIndexerImpl extends AbstractLuceneIndexerImpl<String> impl
}
}
}
/* (non-Javadoc)
* @see org.alfresco.repo.search.Indexer#deleteIndex(org.alfresco.service.cmr.repository.StoreRef)
*/
public void deleteIndex(StoreRef storeRef)
{
deleteIndex();
}
}

View File

@@ -339,5 +339,10 @@ public abstract class AbstractLuceneBase
}
public void deleteIndex()
{
indexInfo.delete(deltaId);
}
}

View File

@@ -356,6 +356,81 @@ public class IndexInfo implements IndexMonitor
FSDirectory.setDisableLocks(true);
}
/**
*
*/
public void delete(final String deltaId)
{
getWriteLock();
try
{
doWithFileLock(new LockWork<Object>()
{
public Object doWork() throws Exception
{
setStatusFromFile();
// If the index is not shared we can do some easy clean
// up
if (!indexIsShared)
{
HashSet<String> deletable = new HashSet<String>();
// clean up
for (IndexEntry entry : indexEntries.values())
{
if(!entry.getName().equals(deltaId))
{
entry.setStatus(TransactionStatus.DELETABLE);
deletable.add(entry.getName());
}
}
// Delete entries that are not required
for (String id : deletable)
{
indexEntries.remove(id);
}
clearOldReaders();
cleaner.schedule();
merger.schedule();
// persist the new state
writeStatus();
if (mainIndexReader != null)
{
if (s_logger.isDebugEnabled())
{
s_logger.debug("... invalidating main index reader");
}
((ReferenceCounting) mainIndexReader).setInvalidForReuse();
mainIndexReader = null;
}
}
return null;
}
public boolean canRetry()
{
return false;
}
});
}
finally
{
releaseWriteLock();
}
if(s_logger.isDebugEnabled())
{
s_logger.debug("Index "+ indexDirectory+" deleted");
}
}
/**
* Get the IndexInfo object based in the given directory. There is only one object per directory per JVM.
*