diff --git a/source/java/org/alfresco/repo/bulkimport/impl/AbstractBulkFilesystemImporter.java b/source/java/org/alfresco/repo/bulkimport/impl/AbstractBulkFilesystemImporter.java index 6700396d0b..dc6b9867a4 100644 --- a/source/java/org/alfresco/repo/bulkimport/impl/AbstractBulkFilesystemImporter.java +++ b/source/java/org/alfresco/repo/bulkimport/impl/AbstractBulkFilesystemImporter.java @@ -29,7 +29,6 @@ import java.io.IOException; import java.util.List; import java.util.Map; -import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.repo.bulkimport.BulkFSImportEvent; import org.alfresco.repo.bulkimport.BulkFilesystemImporter; import org.alfresco.repo.bulkimport.BulkImportParameters; @@ -406,9 +405,8 @@ public abstract class AbstractBulkFilesystemImporter implements BulkFilesystemIm } catch(Throwable e) { - logger.error("Bulk import from '" + getFileName(sourceFolder) + "' failed.", e); importStatus.stopImport(e); - throw new AlfrescoRuntimeException("Bulk filesystem import failed", e); + throw e; } finally { diff --git a/source/java/org/alfresco/repo/bulkimport/impl/BulkImportStatusImpl.java b/source/java/org/alfresco/repo/bulkimport/impl/BulkImportStatusImpl.java index c578c7510f..ec6ccaef80 100644 --- a/source/java/org/alfresco/repo/bulkimport/impl/BulkImportStatusImpl.java +++ b/source/java/org/alfresco/repo/bulkimport/impl/BulkImportStatusImpl.java @@ -29,6 +29,9 @@ import java.io.StringWriter; import java.util.Date; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock; +import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.repo.bulkimport.BulkImportStatus; @@ -96,9 +99,16 @@ public class BulkImportStatusImpl implements BulkImportStatus private AtomicLong numberOfContentVersionBytesWritten = new AtomicLong(); private AtomicLong numberOfContentVersionPropertiesWritten = new AtomicLong(); + private ReadLock readLock; + private WriteLock writeLock; + public BulkImportStatusImpl() { inProgress.set(false); + + ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); + this.readLock = lock.readLock(); + this.writeLock = lock.writeLock(); } // General information @@ -145,27 +155,43 @@ public class BulkImportStatusImpl implements BulkImportStatus public Throwable getLastException() { - return(lastException); + readLock.lock(); + try + { + return(lastException); + } + finally + { + readLock.unlock(); + } } public String getLastExceptionAsString() { String result = null; - - if (lastException != null) + + readLock.lock(); + try { - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw, true); - - lastException.printStackTrace(pw); - - pw.flush(); - sw.flush(); - - result = sw.toString(); - } - - return(result); + if (lastException != null) + { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw, true); + + lastException.printStackTrace(pw); + + pw.flush(); + sw.flush(); + + result = sw.toString(); + } + + return(result); + } + finally + { + readLock.unlock(); + } } public boolean inProgress() @@ -249,7 +275,22 @@ public class BulkImportStatusImpl implements BulkImportStatus public void stopImport(final Throwable lastException) { stopImport(); - this.lastException = lastException; + + writeLock.lock(); + try + { + this.lastException = lastException; + } + finally + { + writeLock.unlock(); + } + } + + public synchronized void reportException(final Throwable exception) + { + stopImport(); + this.lastException = exception; } // Read-side information diff --git a/source/java/org/alfresco/repo/bulkimport/impl/MultiThreadedBulkFilesystemImporter.java b/source/java/org/alfresco/repo/bulkimport/impl/MultiThreadedBulkFilesystemImporter.java index 18f48388b6..02d39a24bd 100644 --- a/source/java/org/alfresco/repo/bulkimport/impl/MultiThreadedBulkFilesystemImporter.java +++ b/source/java/org/alfresco/repo/bulkimport/impl/MultiThreadedBulkFilesystemImporter.java @@ -32,6 +32,7 @@ import org.alfresco.repo.bulkimport.BulkImportParameters; import org.alfresco.repo.bulkimport.FilesystemTracker; import org.alfresco.repo.bulkimport.ImportableItem; import org.alfresco.repo.bulkimport.NodeImporter; +import org.alfresco.repo.node.integrity.IntegrityException; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.service.cmr.repository.NodeRef; import org.apache.commons.logging.Log; @@ -106,6 +107,12 @@ public abstract class MultiThreadedBulkFilesystemImporter extends AbstractBulkFi public void process(final ImportableItem importableItem) throws Throwable { + if(importStatus.getLastException() != null) + { + // bail out early if an exception occurs + return; + } + try { behaviourFilter.disableBehaviour(ContentModel.ASPECT_AUDITABLE); diff --git a/source/java/org/alfresco/repo/bulkimport/impl/StripingBulkFilesystemImporter.java b/source/java/org/alfresco/repo/bulkimport/impl/StripingBulkFilesystemImporter.java index f315f317c0..edf4692629 100644 --- a/source/java/org/alfresco/repo/bulkimport/impl/StripingBulkFilesystemImporter.java +++ b/source/java/org/alfresco/repo/bulkimport/impl/StripingBulkFilesystemImporter.java @@ -26,6 +26,7 @@ package org.alfresco.repo.bulkimport.impl; import java.io.File; +import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.repo.batch.BatchProcessor; import org.alfresco.repo.bulkimport.BulkImportParameters; import org.alfresco.repo.bulkimport.ImportableItem; @@ -61,6 +62,10 @@ public class StripingBulkFilesystemImporter extends MultiThreadedBulkFilesystemI do { batchProcessor.process(worker, true); + if(batchProcessor.getLastError() != null) + { + throw new AlfrescoRuntimeException(batchProcessor.getLastError()); + } } while(tracker.moreLevels()); }