From 81d432ec1bfc7e6902b14064de34c5e2adefa515 Mon Sep 17 00:00:00 2001 From: cramakri <cramakri> Date: Tue, 10 Jul 2012 14:38:52 +0000 Subject: [PATCH] BIS-21 SP-177 : Fixes to this behavior for the API. SVN: 26062 --- .../ITopLevelDataSetRegistratorDelegate.java | 3 ++ .../v1/PutDataSetTopLevelDataSetHandler.java | 7 ++++ ...tOmniscientTopLevelDataSetRegistrator.java | 19 +++++++++-- .../DataSetRegistrationService.java | 9 +++-- .../impl/DataSetRegistrationTransaction.java | 34 ++++++++++++++----- .../DataSetRegistrationTransactionTest.java | 4 ++- 6 files changed, 62 insertions(+), 14 deletions(-) diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/ITopLevelDataSetRegistratorDelegate.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/ITopLevelDataSetRegistratorDelegate.java index 1c5fe622299..500ca1a9240 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/ITopLevelDataSetRegistratorDelegate.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/ITopLevelDataSetRegistratorDelegate.java @@ -18,6 +18,7 @@ package ch.systemsx.cisd.etlserver; import java.util.List; +import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationPreStagingBehavior; import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; /** @@ -28,4 +29,6 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; public interface ITopLevelDataSetRegistratorDelegate { void didRegisterDataSets(List<DataSetInformation> dataSetInformations); + + DataSetRegistrationPreStagingBehavior getPrestagingBehavior(); } diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetTopLevelDataSetHandler.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetTopLevelDataSetHandler.java index 43d41a7eec6..ec4c5fe33eb 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetTopLevelDataSetHandler.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetTopLevelDataSetHandler.java @@ -35,6 +35,7 @@ import ch.systemsx.cisd.common.exceptions.UserFailureException; import ch.systemsx.cisd.common.io.ConcatenatedFileOutputStreamWriter; import ch.systemsx.cisd.etlserver.ITopLevelDataSetRegistrator; import ch.systemsx.cisd.etlserver.ITopLevelDataSetRegistratorDelegate; +import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationPreStagingBehavior; import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.FileInfoDssDTO; import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.NewDataSetDTO; @@ -70,6 +71,12 @@ class PutDataSetTopLevelDataSetHandler registeredDataSets.addAll(dataSetInformations); } + @Override + public DataSetRegistrationPreStagingBehavior getPrestagingBehavior() + { + return DataSetRegistrationPreStagingBehavior.USE_ORIGINAL; + } + } // General State diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/AbstractOmniscientTopLevelDataSetRegistrator.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/AbstractOmniscientTopLevelDataSetRegistrator.java index 9d5691c4558..53f3318ca59 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/AbstractOmniscientTopLevelDataSetRegistrator.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/AbstractOmniscientTopLevelDataSetRegistrator.java @@ -233,12 +233,24 @@ public abstract class AbstractOmniscientTopLevelDataSetRegistrator<T extends Dat public static class NoOpDelegate implements ITopLevelDataSetRegistratorDelegate { + private final DataSetRegistrationPreStagingBehavior preStagingBehavior; + + public NoOpDelegate(DataSetRegistrationPreStagingBehavior preStagingBehavior) + { + this.preStagingBehavior = preStagingBehavior; + } @Override public void didRegisterDataSets(List<DataSetInformation> dataSetInformations) { } + @Override + public DataSetRegistrationPreStagingBehavior getPrestagingBehavior() + { + return preStagingBehavior; + } + } protected final OmniscientTopLevelDataSetRegistratorState state; @@ -367,7 +379,8 @@ public abstract class AbstractOmniscientTopLevelDataSetRegistrator<T extends Dat if (preStagingUsage == DataSetRegistrationPreStagingBehavior.USE_ORIGINAL) { DataSetFile incoming = new DataSetFile(incomingDataSetFile); - handle(incoming, null, new NoOpDelegate(), markerFileCleanupAction); + handle(incoming, null, new NoOpDelegate( + DataSetRegistrationPreStagingBehavior.USE_ORIGINAL), markerFileCleanupAction); } else { // If we should the prestaging phase, we make a hardlink copy in prestaging area @@ -378,7 +391,9 @@ public abstract class AbstractOmniscientTopLevelDataSetRegistrator<T extends Dat // For cleanup we use the postRegistrationCleanUpAction wich clears the prestaging area. PostRegistrationCleanUpAction cleanupAction = new PostRegistrationCleanUpAction(dsf, markerFileCleanupAction); - handle(dsf, null, new NoOpDelegate(), cleanupAction); + handle(dsf, null, + new NoOpDelegate(DataSetRegistrationPreStagingBehavior.USE_PRESTAGING), + cleanupAction); } } diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetRegistrationService.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetRegistrationService.java index d64d702b0ec..7e0b1b41198 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetRegistrationService.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetRegistrationService.java @@ -347,8 +347,8 @@ public class DataSetRegistrationService<T extends DataSetInformation> implements } else if (dataSetInformation.isLinkDataSet()) { algorithm = - new LinkDataSetStorageAlgorithm<T>(dataSetFile, dataSetDetails, - strategy, registratorContext.getStorageProcessor(), + new LinkDataSetStorageAlgorithm<T>(dataSetFile, dataSetDetails, strategy, + registratorContext.getStorageProcessor(), globalContext.getDataSetValidator(), globalContext.getDssCode(), registratorContext.getFileOperations(), globalContext.getMailClient(), stagingDirectory, precommitDirectory); @@ -447,4 +447,9 @@ public class DataSetRegistrationService<T extends DataSetInformation> implements return incomingDataSetFile; } + public boolean shouldUsePrestaging() + { + return delegate.getPrestagingBehavior() == DataSetRegistrationPreStagingBehavior.USE_PRESTAGING; + } + } diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransaction.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransaction.java index 7d20982bce9..fd3e3295677 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransaction.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransaction.java @@ -37,6 +37,7 @@ import ch.systemsx.cisd.etlserver.registrator.DataSetFile; import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationContext; import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationDetails; import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationPersistentMap; +import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationPreStagingBehavior; import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationService; import ch.systemsx.cisd.etlserver.registrator.DataSetStorageAlgorithmRunner; import ch.systemsx.cisd.etlserver.registrator.IDataSetOnErrorActionDecision.ErrorType; @@ -542,19 +543,34 @@ public class DataSetRegistrationTransaction<T extends DataSetInformation> implem IEntityOperationService<T> entityRegistrationService = registrationService.getEntityRegistrationService(); - File realIncomingFile = getIncomingDataSetFile().getRealIncomingFile(); - if (false == realIncomingFile.exists()) + verifyOriginalFileIsStillAvailable(); + + entityRegistrationService.performOperationsInApplcationServer(registrationDetails); + } + + /** + * If we use prestaging, then we check that the original file has not been deleted. + */ + private void verifyOriginalFileIsStillAvailable() + { + if (false == registrationService.shouldUsePrestaging()) { - StringBuilder sb = new StringBuilder(); - sb.append("Incoming file ["); - sb.append(realIncomingFile.getAbsolutePath()); - sb.append("] "); - sb.append(" was deleted before registration."); + return; + } - throw new IncomingFileDeletedBeforeRegistrationException(sb.toString()); + File realIncomingFile = getIncomingDataSetFile().getRealIncomingFile(); + if (realIncomingFile.exists()) + { + return; } - entityRegistrationService.performOperationsInApplcationServer(registrationDetails); + StringBuilder sb = new StringBuilder(); + sb.append("Incoming file ["); + sb.append(realIncomingFile.getAbsolutePath()); + sb.append("] "); + sb.append(" was deleted before registration."); + + throw new IncomingFileDeletedBeforeRegistrationException(sb.toString()); } @Override diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransactionTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransactionTest.java index 66fe972d75d..83d555e40a1 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransactionTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransactionTest.java @@ -47,6 +47,7 @@ import ch.systemsx.cisd.etlserver.TopLevelDataSetRegistratorGlobalState; import ch.systemsx.cisd.etlserver.registrator.AbstractOmniscientTopLevelDataSetRegistrator; import ch.systemsx.cisd.etlserver.registrator.DataSetFile; import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationDetails; +import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationPreStagingBehavior; import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationService; import ch.systemsx.cisd.etlserver.registrator.IDataSetRegistrationDetailsFactory; import ch.systemsx.cisd.etlserver.registrator.api.v1.IDataSet; @@ -703,7 +704,8 @@ public class DataSetRegistrationTransactionTest extends AbstractFileSystemTestCa DataSetFile dataSetFile) { return createDataSetRegistrationService(dataSetFile, null, - new DoNothingDelegatedAction(), new NoOpDelegate()); + new DoNothingDelegatedAction(), new NoOpDelegate( + DataSetRegistrationPreStagingBehavior.USE_ORIGINAL)); } /** -- GitLab