diff --git a/config/alfresco/bootstrap-context.xml b/config/alfresco/bootstrap-context.xml
index 87cdb01220..34e3259493 100644
--- a/config/alfresco/bootstrap-context.xml
+++ b/config/alfresco/bootstrap-context.xml
@@ -271,6 +271,13 @@
+
+
+
+
+
+
+
diff --git a/config/alfresco/index-recovery-context.xml b/config/alfresco/index-recovery-context.xml
index cfd662fa90..ebe7b15b41 100644
--- a/config/alfresco/index-recovery-context.xml
+++ b/config/alfresco/index-recovery-context.xml
@@ -43,6 +43,22 @@
${index.recovery.mode}
+
+
+
+ ${index.recovery.mode}
+
+
+
+
+
+
+
+
+
true, i.e. the server will be locked against further updates.
+ *
+ * @param lockServer
+ * true to force the server to be read-only
+ */
+ public void setLockServer(boolean lockServer)
+ {
+ this.lockServer = lockServer;
+ }
+
+
+ public void setAvmService(AVMService avmService)
+ {
+ this.avmService = avmService;
+ }
+
+ public void setAvmSnapShotTriggeredIndexingMethodInterceptor(
+ AVMSnapShotTriggeredIndexingMethodInterceptor avmSnapShotTriggeredIndexingMethodInterceptor)
+ {
+ this.avmSnapShotTriggeredIndexingMethodInterceptor = avmSnapShotTriggeredIndexingMethodInterceptor;
+ }
+
+ @Override
+ protected void reindexImpl()
+ {
+ processStores();
+ }
+
+ private void processStores()
+ {
+ List stores = avmService.getStores();
+ if(stores.size() == 0)
+ {
+ return;
+ }
+ int count = 0;
+ int tracker = -1;
+ logger.info("Checking indexes for AVM Stores");
+ for (AVMStoreDescriptor store : stores)
+ {
+ if (isShuttingDown())
+ {
+ return;
+ }
+ processStore(store.getName());
+ count++;
+ if (count*10l/stores.size() > tracker)
+ {
+ tracker = (int)(count*10l/stores.size());
+ logger.info(" Stores "+(tracker*10)+"% complete");
+ }
+ }
+ logger.info("Finished checking indexes for AVM Stores");
+ }
+
+ private void processStore(String store)
+ {
+ if (logger.isDebugEnabled())
+ {
+ logger.debug("Performing AVM index recovery for type: " + recoveryMode + " on store " + store);
+ }
+
+ // do we just ignore
+ if (recoveryMode == RecoveryMode.NONE)
+ {
+ return;
+ }
+ // check the level of cover required
+ boolean fullRecoveryRequired = false;
+ if (recoveryMode == RecoveryMode.FULL) // no validate required
+ {
+ fullRecoveryRequired = true;
+ }
+ else
+ // validate first
+ {
+ int lastActualSnapshotId = avmService.getLatestSnapshotID(store);
+ if (lastActualSnapshotId <= 0)
+ {
+ return;
+ }
+ int lastIndexedSnapshotId = avmSnapShotTriggeredIndexingMethodInterceptor.getLastIndexedSnapshot(store);
+ if (lastActualSnapshotId != lastIndexedSnapshotId)
+ {
+ logger.warn("Index for avm store " + store + " is out of date");
+ // this store isn't up to date
+ if (recoveryMode == RecoveryMode.VALIDATE)
+ {
+ // the store is out of date - validation failed
+ }
+ else if (recoveryMode == RecoveryMode.AUTO)
+ {
+ fullRecoveryRequired = true;
+ }
+ }
+ }
+
+ // put the server into read-only mode for the duration
+ boolean allowWrite = !transactionService.isReadOnly();
+ try
+ {
+ if (lockServer)
+ {
+ // set the server into read-only mode
+ transactionService.setAllowWrite(false);
+ }
+
+ // do we need to perform a full recovery
+ if (fullRecoveryRequired)
+ {
+ recoverStore(store);
+ }
+ }
+ finally
+ {
+ // restore read-only state
+ transactionService.setAllowWrite(allowWrite);
+ }
+
+ }
+
+ private void recoverStore(String store)
+ {
+ int tracker = -1;
+ int latest = avmService.getLatestSnapshotID(store);
+ if(latest <= 0)
+ {
+ return;
+ }
+ logger.info("Recovery for "+store);
+
+ if(!avmSnapShotTriggeredIndexingMethodInterceptor.hasIndexBeenCreated(store))
+ {
+ avmSnapShotTriggeredIndexingMethodInterceptor.createIndex(store);
+ }
+ for (int i = 0; i <= latest; i++)
+ {
+ if (isShuttingDown())
+ {
+ return;
+ }
+ recoverSnapShot(store, i);
+ if (i*10l/latest > tracker)
+ {
+ tracker = (int)(i*10l/latest);
+ logger.info(" Store "+store +" "+(tracker*10)+"% complete");
+ }
+ }
+ logger.info("Recovery for "+store+" done");
+ }
+
+ private void recoverSnapShot(final String store, final int id)
+ {
+ if (logger.isDebugEnabled())
+ {
+ logger.debug("Reindexing avm store: " + store + " snapshot id " + id);
+ }
+
+ TransactionWork