diff --git a/source/java/org/alfresco/repo/node/index/AVMFullIndexRecoveryComponent.java b/source/java/org/alfresco/repo/node/index/AVMFullIndexRecoveryComponent.java index af884ccc77..1c86f056f5 100644 --- a/source/java/org/alfresco/repo/node/index/AVMFullIndexRecoveryComponent.java +++ b/source/java/org/alfresco/repo/node/index/AVMFullIndexRecoveryComponent.java @@ -287,6 +287,16 @@ public class AVMFullIndexRecoveryComponent extends AbstractReindexComponent else if (mode == RecoveryMode.FULL) { logger.info(" Rebuilding index for " + store); + // delete existing index + RetryingTransactionCallback deleteWork = new RetryingTransactionCallback() + { + public Void execute() throws Exception + { + avmSnapShotTriggeredIndexingMethodInterceptor.deleteIndex(store); + return null; + } + }; + transactionService.getRetryingTransactionHelper().doInTransaction(deleteWork, true, true); } final int latest = avmService.getLatestSnapshotID(store); diff --git a/source/java/org/alfresco/repo/node/index/FullIndexRecoveryComponent.java b/source/java/org/alfresco/repo/node/index/FullIndexRecoveryComponent.java index 787cb67ce6..eb5507e25f 100644 --- a/source/java/org/alfresco/repo/node/index/FullIndexRecoveryComponent.java +++ b/source/java/org/alfresco/repo/node/index/FullIndexRecoveryComponent.java @@ -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 deleteWork = new RetryingTransactionCallback() + { + 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); diff --git a/source/java/org/alfresco/repo/search/AVMSnapShotTriggeredIndexingMethodInterceptor.java b/source/java/org/alfresco/repo/search/AVMSnapShotTriggeredIndexingMethodInterceptor.java index 6dedaa63c5..f802f0aafb 100644 --- a/source/java/org/alfresco/repo/search/AVMSnapShotTriggeredIndexingMethodInterceptor.java +++ b/source/java/org/alfresco/repo/search/AVMSnapShotTriggeredIndexingMethodInterceptor.java @@ -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); + } + } } diff --git a/source/java/org/alfresco/repo/search/Indexer.java b/source/java/org/alfresco/repo/search/Indexer.java index 796f510c18..b37f4f7a33 100644 --- a/source/java/org/alfresco/repo/search/Indexer.java +++ b/source/java/org/alfresco/repo/search/Indexer.java @@ -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); + diff --git a/source/java/org/alfresco/repo/search/IndexerComponent.java b/source/java/org/alfresco/repo/search/IndexerComponent.java index a61d0d00f4..455775b546 100644 --- a/source/java/org/alfresco/repo/search/IndexerComponent.java +++ b/source/java/org/alfresco/repo/search/IndexerComponent.java @@ -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); + } + } diff --git a/source/java/org/alfresco/repo/search/impl/NoActionIndexer.java b/source/java/org/alfresco/repo/search/impl/NoActionIndexer.java index e4a4fa333a..46b98177e3 100644 --- a/source/java/org/alfresco/repo/search/impl/NoActionIndexer.java +++ b/source/java/org/alfresco/repo/search/impl/NoActionIndexer.java @@ -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; + } + } diff --git a/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneIndexerImpl.java b/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneIndexerImpl.java index 77678a8c3a..7fdfa6d3fc 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneIndexerImpl.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneIndexerImpl.java @@ -1697,4 +1697,12 @@ public class ADMLuceneIndexerImpl extends AbstractLuceneIndexerImpl imp } + /* (non-Javadoc) + * @see org.alfresco.repo.search.Indexer#deleteIndex(org.alfresco.service.cmr.repository.StoreRef) + */ + public void deleteIndex(StoreRef storeRef) + { + deleteIndex(); + } + } diff --git a/source/java/org/alfresco/repo/search/impl/lucene/AVMLuceneIndexerImpl.java b/source/java/org/alfresco/repo/search/impl/lucene/AVMLuceneIndexerImpl.java index 96f7bdd5a0..5cf50ee7d8 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/AVMLuceneIndexerImpl.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/AVMLuceneIndexerImpl.java @@ -1588,7 +1588,7 @@ public class AVMLuceneIndexerImpl extends AbstractLuceneIndexerImpl 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 impl } } } + + /* (non-Javadoc) + * @see org.alfresco.repo.search.Indexer#deleteIndex(org.alfresco.service.cmr.repository.StoreRef) + */ + public void deleteIndex(StoreRef storeRef) + { + deleteIndex(); + + } } diff --git a/source/java/org/alfresco/repo/search/impl/lucene/AbstractLuceneBase.java b/source/java/org/alfresco/repo/search/impl/lucene/AbstractLuceneBase.java index f834f2d1a0..5ea369224a 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/AbstractLuceneBase.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/AbstractLuceneBase.java @@ -338,6 +338,11 @@ public abstract class AbstractLuceneBase return indexInfo.doWithWriteLock(lockWork); } + + public void deleteIndex() + { + indexInfo.delete(deltaId); + } } 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 7094335f12..cedb64b200 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 @@ -355,6 +355,81 @@ public class IndexInfo implements IndexMonitor // We do not require any of the lucene in-built locking. FSDirectory.setDisableLocks(true); } + + /** + * + */ + public void delete(final String deltaId) + { + + getWriteLock(); + try + { + doWithFileLock(new LockWork() + { + public Object doWork() throws Exception + { + setStatusFromFile(); + + // If the index is not shared we can do some easy clean + // up + if (!indexIsShared) + { + HashSet deletable = new HashSet(); + // 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.