From e3403411612080b7ca596b9a7b150259c8868d00 Mon Sep 17 00:00:00 2001 From: tpylak <tpylak> Date: Fri, 26 Jun 2009 11:48:27 +0000 Subject: [PATCH] LMS-986 1) allow storage processor to say, what should happen with a dataset after unstore() has been called. The data can be moved to error directory or stay untouched. 2) pass the exception which has caused the rollback to the unstore() method SVN: 11583 --- .../AbstractDelegatingStorageProcessor.java | 5 +++-- ...DelegatingStorageProcessorWithDropbox.java | 6 +++--- .../cisd/etlserver/BDSStorageProcessor.java | 9 +++++++- .../etlserver/DefaultStorageProcessor.java | 5 +++-- .../cisd/etlserver/IStorageProcessor.java | 21 ++++++++++++++++++- .../etlserver/TransferredDataSetHandler.java | 8 ++++--- 6 files changed, 42 insertions(+), 12 deletions(-) diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractDelegatingStorageProcessor.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractDelegatingStorageProcessor.java index 406417c21d8..6993ee1df2c 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractDelegatingStorageProcessor.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractDelegatingStorageProcessor.java @@ -101,9 +101,10 @@ abstract public class AbstractDelegatingStorageProcessor implements IStorageProc incomingDataSetDirectory, rootDir); } - public void unstoreData(final File incomingDataSetDirectory, final File storedDataDirectory) + public UnstoreDataAction unstoreData(final File incomingDataSetDirectory, + final File storedDataDirectory, Throwable exception) { - delegate.unstoreData(incomingDataSetDirectory, storedDataDirectory); + return delegate.unstoreData(incomingDataSetDirectory, storedDataDirectory, exception); } public StorageFormat getStorageFormat() diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractDelegatingStorageProcessorWithDropbox.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractDelegatingStorageProcessorWithDropbox.java index 6ca7187bffb..0f82df7c0a8 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractDelegatingStorageProcessorWithDropbox.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractDelegatingStorageProcessorWithDropbox.java @@ -147,14 +147,14 @@ abstract public class AbstractDelegatingStorageProcessorWithDropbox extends } @Override - public final void unstoreData(final File incomingDataSetDirectory, - final File storedDataDirectory) + public UnstoreDataAction unstoreData(final File incomingDataSetDirectory, + final File storedDataDirectory, Throwable exception) { if (recentlyStoredDropboxDataset != null && recentlyStoredDropboxDataset.exists()) { fileOperations.deleteRecursively(recentlyStoredDropboxDataset); } recentlyStoredDropboxDataset = null; - super.unstoreData(incomingDataSetDirectory, storedDataDirectory); + return super.unstoreData(incomingDataSetDirectory, storedDataDirectory, exception); } } diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/BDSStorageProcessor.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/BDSStorageProcessor.java index e5cc4408327..9336bbac572 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/BDSStorageProcessor.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/BDSStorageProcessor.java @@ -478,7 +478,14 @@ public final class BDSStorageProcessor extends AbstractStorageProcessor implemen return dataStructureDir; } - public final void unstoreData(final File incomingDataSetDirectory, + public UnstoreDataAction unstoreData(File incomingDataSetDirectory, File storedDataDirectory, + Throwable exception) + { + unstoreData(incomingDataSetDirectory, storedDataDirectory); + return UnstoreDataAction.MOVE_TO_ERROR; + } + + private final void unstoreData(final File incomingDataSetDirectory, final File storedDataDirectory) { checkParameters(incomingDataSetDirectory, storedDataDirectory); diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/DefaultStorageProcessor.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/DefaultStorageProcessor.java index 35fa2700b6d..f756a57ab94 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/DefaultStorageProcessor.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/DefaultStorageProcessor.java @@ -68,8 +68,8 @@ public class DefaultStorageProcessor extends AbstractStorageProcessor return rootDir; } - public final void unstoreData(final File incomingDataSetDirectory, - final File storedDataDirectory) + public UnstoreDataAction unstoreData(final File incomingDataSetDirectory, + final File storedDataDirectory, Throwable exception) { checkParameters(incomingDataSetDirectory, storedDataDirectory); File targetFile = @@ -79,6 +79,7 @@ public class DefaultStorageProcessor extends AbstractStorageProcessor // directory structure will persist. Right now, we consider this is fine as these empty // directories will not disturb the running application. FileRenamer.renameAndLog(targetFile, incomingDataSetDirectory); + return UnstoreDataAction.MOVE_TO_ERROR; } private static File getOriginalDirectory(final File storedDataDirectory) diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/IStorageProcessor.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/IStorageProcessor.java index 4e87d141299..dce604405ee 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/IStorageProcessor.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/IStorageProcessor.java @@ -62,6 +62,22 @@ public interface IStorageProcessor extends IStoreRootDirectoryHolder final ITypeExtractor typeExtractor, final IMailClient mailClient, final File incomingDataSetDirectory, final File rootDir); + /** + * Instructs the dataset handler what to do with the data in incoming directory if there was an + * error during registration in openbis. + */ + public enum UnstoreDataAction + { + /** + * moved the data to the error directory + */ + MOVE_TO_ERROR, + /** + * leave the data in the incoming directory + */ + LEAVE_UNTOUCH + } + /** * Performs a rollback of * {@link #storeData(SamplePE, DataSetInformation, ITypeExtractor, IMailClient, File, File)} The @@ -73,8 +89,11 @@ public interface IStorageProcessor extends IStoreRootDirectoryHolder * * @param incomingDataSetDirectory original folder to be restored. * @param storedDataDirectory directory which contains the data to be restored. + * @param exception an exception which has caused that the unstore operation has to be performed + * @return an instruction what to do with the data in incoming directory */ - public void unstoreData(final File incomingDataSetDirectory, final File storedDataDirectory); + public UnstoreDataAction unstoreData(final File incomingDataSetDirectory, + final File storedDataDirectory, Throwable exception); /** * Returns the format that this storage processor is storing data sets in. diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandler.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandler.java index d5ef3778cd6..56471ee83f4 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandler.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandler.java @@ -55,6 +55,7 @@ import ch.systemsx.cisd.common.types.BooleanOrUnknown; import ch.systemsx.cisd.common.utilities.BeanUtils; import ch.systemsx.cisd.common.utilities.IDelegatedActionWithResult; import ch.systemsx.cisd.common.utilities.ISelfTestable; +import ch.systemsx.cisd.etlserver.IStorageProcessor.UnstoreDataAction; import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetType; @@ -466,9 +467,10 @@ public final class TransferredDataSetHandler implements IPathHandler, ISelfTesta { throw (Error) throwable; } - storageProcessor.unstoreData(incomingDataSetFile, baseDirectoryHolder - .getBaseDirectory()); - if (stopped == false) + UnstoreDataAction action = + storageProcessor.unstoreData(incomingDataSetFile, baseDirectoryHolder + .getBaseDirectory(), throwable); + if (stopped == false && action == UnstoreDataAction.MOVE_TO_ERROR) { final File baseDirectory = createBaseDirectory(ERROR_DATA_STRATEGY, storeRoot, dataSetInformation); -- GitLab