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 1c5fe6222992eba18d9a777f502edf872b1584bc..500ca1a92401d9a1024008c1cdcca64d200c4445 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 43d41a7eec656a17b77eaa74832f380ff0bbe096..ec4c5fe33eb85916dd5777b93e37ace3c3c625ed 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 9d5691c455859aceacf553bf74ad553543c7af46..53f3318ca594b8698d9d1fd6654196bcbef1e914 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 d64d702b0ec60068d6df645e2cbfa4f97b98f7d3..7e0b1b411986ea612f83d54ea8b4495226f40757 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 7d20982bce93469d4d828b8550c849ccce4dc30f..fd3e329567764298034a884850f1c8b55e7526f5 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 66fe972d75dd5eedc0a0067b66426ee8a443d00b..83d555e40a1c374af7a5a010d82f297cbbb00e29 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)); } /**