diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetFile.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetFile.java index a5a072e755366a2f6fcc23f08591f868b1de0e8a..2b17954baddf6fb6c2cb4eda3e59834ddd1830e7 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetFile.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetFile.java @@ -56,8 +56,15 @@ public class DataSetFile implements Serializable return (logicalIncomingFile != null) ? logicalIncomingFile : realIncomingFile; } + public boolean isLogicalFileSpecified() + { + return logicalIncomingFile != null + && (false == (realIncomingFile.equals(logicalIncomingFile))); + } + /** - * @returns something like "original file: /local/path/inbox/file.txt logical file: /local/path/pre-staging/file.txt" + * @returns something like + * "original file: /local/path/inbox/file.txt logical file: /local/path/pre-staging/file.txt" */ @Override public String toString() diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v1/AbstractOmniscientTopLevelDataSetRegistrator.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v1/AbstractOmniscientTopLevelDataSetRegistrator.java index cce088c64ed09c3357e5365b8449c90e5d23cb3b..6afedcc0e5df0484e6ef54b2e1e5088d77dd04f1 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v1/AbstractOmniscientTopLevelDataSetRegistrator.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v1/AbstractOmniscientTopLevelDataSetRegistrator.java @@ -410,6 +410,7 @@ public abstract class AbstractOmniscientTopLevelDataSetRegistrator<T extends Dat new DssUniqueFilenameGenerator(globalState.getThreadParameters().getThreadName(), incomingDataSetFile.getName(), null).generateFilename(); File preStagingDir = new File(preStagingRootDir, incomingDirName); + preStagingDir.mkdir(); // Try to find a hardlink maker @@ -548,8 +549,7 @@ public abstract class AbstractOmniscientTopLevelDataSetRegistrator<T extends Dat ErrorType.REGISTRATION_SCRIPT_ERROR, ex); DataSetStorageRollbacker rollbacker = new DataSetStorageRollbacker(getRegistratorState(), operationLog, action, - incomingDataSetFile.getRealIncomingFile(), null, ex, - ErrorType.REGISTRATION_SCRIPT_ERROR); + incomingDataSetFile, null, ex, ErrorType.REGISTRATION_SCRIPT_ERROR); operationLog.info(rollbacker.getErrorMessageForLog()); service.getDssRegistrationLog().log("Processing failed : " + ex.toString()); @@ -589,8 +589,7 @@ public abstract class AbstractOmniscientTopLevelDataSetRegistrator<T extends Dat ErrorType.INVALID_DATA_SET, null); DataSetStorageRollbacker rollbacker = new DataSetStorageRollbacker(getRegistratorState(), operationLog, action, - incomingDataSetFile.getRealIncomingFile(), null, null, - ErrorType.INVALID_DATA_SET); + incomingDataSetFile, null, null, ErrorType.INVALID_DATA_SET); sb.append(rollbacker.getErrorMessageForLog()); String logMessage = sb.toString(); operationLog.info(logMessage); diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v1/DataSetRegistrationService.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v1/DataSetRegistrationService.java index 6543c7e53d369fa4ba063306d2144e77d2512481..b51e468894f467f3079c91062b34149df913da96 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v1/DataSetRegistrationService.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v1/DataSetRegistrationService.java @@ -251,7 +251,7 @@ public class DataSetRegistrationService<T extends DataSetInformation> implements { DataSetStorageRollbacker rollbacker = new DataSetStorageRollbacker(registratorContext, operationLog, - UnstoreDataAction.MOVE_TO_ERROR, incomingDataSetFile.getRealIncomingFile(), + UnstoreDataAction.MOVE_TO_ERROR, incomingDataSetFile, dataSetTypeCodeOrNull, null); return rollbacker.doRollback(dssRegistrationLog); } @@ -268,7 +268,7 @@ public class DataSetRegistrationService<T extends DataSetInformation> implements registratorContext.getOnErrorActionDecision().computeUndoAction(errorType, ex); DataSetStorageRollbacker rollbacker = new DataSetStorageRollbacker(registratorContext, operationLog, action, - incomingDataSetFile.getRealIncomingFile(), null, ex, errorType); + incomingDataSetFile, null, ex, errorType); operationLog.info(rollbacker.getErrorMessageForLog()); rollbacker.doRollback(dssRegistrationLog); } diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v1/DataSetStorageRollbacker.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v1/DataSetStorageRollbacker.java index f2e340079caa763edabeb65202afc07a3c3d427d..b936c97431151d05d1338fe9c0479a1a1ebc1d09 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v1/DataSetStorageRollbacker.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v1/DataSetStorageRollbacker.java @@ -31,6 +31,7 @@ import ch.systemsx.cisd.etlserver.DssRegistrationLogger; import ch.systemsx.cisd.etlserver.FileRenamer; import ch.systemsx.cisd.etlserver.IStorageProcessorTransactional.UnstoreDataAction; import ch.systemsx.cisd.etlserver.TransferredDataSetHandler; +import ch.systemsx.cisd.etlserver.registrator.DataSetFile; import ch.systemsx.cisd.etlserver.registrator.v1.AbstractOmniscientTopLevelDataSetRegistrator.OmniscientTopLevelDataSetRegistratorState; import ch.systemsx.cisd.etlserver.registrator.v1.IDataSetOnErrorActionDecision.ErrorType; import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; @@ -50,7 +51,7 @@ public class DataSetStorageRollbacker private final UnstoreDataAction unstoreAction; - private final File incomingDataSetFile; + private final DataSetFile incomingDataSetFile; private final String dataSetTypeCodeOrNull; @@ -71,7 +72,7 @@ public class DataSetStorageRollbacker * @param errorOrNull */ public DataSetStorageRollbacker(OmniscientTopLevelDataSetRegistratorState registratorContext, - Logger operationLog, UnstoreDataAction unstoreAction, File incomingDataSetFile, + Logger operationLog, UnstoreDataAction unstoreAction, DataSetFile incomingDataSetFile, String dataSetTypeCodeOrNull, Throwable errorOrNull) { this(registratorContext, operationLog, unstoreAction, incomingDataSetFile, @@ -89,7 +90,7 @@ public class DataSetStorageRollbacker * @param errorOrNull */ public DataSetStorageRollbacker(OmniscientTopLevelDataSetRegistratorState registratorContext, - Logger operationLog, UnstoreDataAction unstoreAction, File incomingDataSetFile, + Logger operationLog, UnstoreDataAction unstoreAction, DataSetFile incomingDataSetFile, String dataSetTypeCodeOrNull, Throwable errorOrNull, ErrorType errorTypeOrNull) { super(); @@ -123,6 +124,14 @@ public class DataSetStorageRollbacker public File doRollback(DssRegistrationLogger dssRegistrationLog) { dssRegistrationLog.log(getErrorMessageForLog()); + + // delete pre-staging copy always - even if not deleting the real incoming directory + if (incomingDataSetFile.isLogicalFileSpecified()) + { + FileUtilities.deleteRecursively(incomingDataSetFile.getLogicalIncomingFile() + .getParentFile()); + } + if (unstoreAction == UnstoreDataAction.MOVE_TO_ERROR) { File newLocation = moveIncomingToError(); @@ -140,16 +149,16 @@ public class DataSetStorageRollbacker { dssRegistrationLog.log("File has been deleted."); - FileUtilities.deleteRecursively(incomingDataSetFile, + FileUtilities.deleteRecursively(incomingDataSetFile.getRealIncomingFile(), new Log4jSimpleLogger(operationLog)); return null; } StringBuilder untouchedMessage = new StringBuilder(); untouchedMessage.append("File has been left untouched "); - untouchedMessage.append(incomingDataSetFile.getAbsolutePath()); + untouchedMessage.append(incomingDataSetFile.getRealIncomingFile().getAbsolutePath()); dssRegistrationLog.log(untouchedMessage.toString()); - return incomingDataSetFile; + return incomingDataSetFile.getRealIncomingFile(); } public File moveIncomingToError() @@ -171,13 +180,14 @@ public class DataSetStorageRollbacker TransferredDataSetHandler.ERROR_DATA_STRATEGY, registratorContext .getStorageProcessor().getStoreRootDirectory(), registratorContext .getFileOperations(), dataSetInfo, dataSetInfo.getDataSetType(), - incomingDataSetFile); + incomingDataSetFile.getRealIncomingFile()); baseDirectoryHolder = new BaseDirectoryHolder(TransferredDataSetHandler.ERROR_DATA_STRATEGY, - baseDirectory, incomingDataSetFile); + baseDirectory, incomingDataSetFile.getRealIncomingFile()); // Move the incoming there - FileRenamer.renameAndLog(incomingDataSetFile, baseDirectoryHolder.getTargetFile()); + FileRenamer.renameAndLog(incomingDataSetFile.getRealIncomingFile(), + baseDirectoryHolder.getTargetFile()); return baseDirectoryHolder.getTargetFile(); } @@ -187,7 +197,7 @@ public class DataSetStorageRollbacker private void writeThrowable() { assert errorOrNull != null; - final String fileName = incomingDataSetFile.getName() + ".exception"; + final String fileName = incomingDataSetFile.getRealIncomingFile().getName() + ".exception"; final File file = new File(baseDirectoryHolder.getTargetFile().getParentFile(), fileName); FileWriter writer = null; try diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v2/AbstractOmniscientTopLevelDataSetRegistrator.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v2/AbstractOmniscientTopLevelDataSetRegistrator.java index 798903b795f48f964b9a1ee6c1cdfd1d9eebd24a..b9a0bd24a9f7519236db2c39ca221afd11ec35a9 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v2/AbstractOmniscientTopLevelDataSetRegistrator.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v2/AbstractOmniscientTopLevelDataSetRegistrator.java @@ -571,8 +571,7 @@ public abstract class AbstractOmniscientTopLevelDataSetRegistrator<T extends Dat ErrorType.REGISTRATION_SCRIPT_ERROR, ex); DataSetStorageRollbacker rollbacker = new DataSetStorageRollbacker(getRegistratorState(), operationLog, action, - incomingDataSetFile.getRealIncomingFile(), null, ex, - ErrorType.REGISTRATION_SCRIPT_ERROR); + incomingDataSetFile, null, ex, ErrorType.REGISTRATION_SCRIPT_ERROR); operationLog.info(rollbacker.getErrorMessageForLog()); service.getDssRegistrationLog().log("Processing failed : " + ex.toString()); @@ -612,8 +611,7 @@ public abstract class AbstractOmniscientTopLevelDataSetRegistrator<T extends Dat ErrorType.INVALID_DATA_SET, null); DataSetStorageRollbacker rollbacker = new DataSetStorageRollbacker(getRegistratorState(), operationLog, action, - incomingDataSetFile.getRealIncomingFile(), null, null, - ErrorType.INVALID_DATA_SET); + incomingDataSetFile, null, null, ErrorType.INVALID_DATA_SET); sb.append(rollbacker.getErrorMessageForLog()); String logMessage = sb.toString(); operationLog.info(logMessage); diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v2/AbstractProgrammableTopLevelDataSetHandler.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v2/AbstractProgrammableTopLevelDataSetHandler.java index 50bfc19a34a3940addcea891f8d2f2bd40204fc0..38bf43f4ef78d4d0645df31887ff0025b385ff49 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v2/AbstractProgrammableTopLevelDataSetHandler.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v2/AbstractProgrammableTopLevelDataSetHandler.java @@ -479,8 +479,8 @@ public abstract class AbstractProgrammableTopLevelDataSetHandler<T extends DataS state.getOnErrorActionDecision().computeUndoAction( ErrorType.OPENBIS_REGISTRATION_FAILURE, null); DataSetStorageRollbacker rollbacker = - new DataSetStorageRollbacker(state, operationLog, action, recoveryState - .getIncomingDataSetFile().getRealIncomingFile(), null, null, + new DataSetStorageRollbacker(state, operationLog, action, + recoveryState.getIncomingDataSetFile(), null, null, ErrorType.OPENBIS_REGISTRATION_FAILURE); operationLog.info(rollbacker.getErrorMessageForLog()); rollbacker.doRollback(logger); diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v2/DataSetRegistrationService.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v2/DataSetRegistrationService.java index 18d7fd7550500d4c711ffd33ab5172b5b70173e0..9f5c98f2d4cb2393c51bc03adbfd0ab3de589a8f 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v2/DataSetRegistrationService.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v2/DataSetRegistrationService.java @@ -232,7 +232,7 @@ public class DataSetRegistrationService<T extends DataSetInformation> implements { DataSetStorageRollbacker rollbacker = new DataSetStorageRollbacker(registratorContext, operationLog, - UnstoreDataAction.MOVE_TO_ERROR, incomingDataSetFile.getRealIncomingFile(), + UnstoreDataAction.MOVE_TO_ERROR, incomingDataSetFile, dataSetTypeCodeOrNull, null); return rollbacker.doRollback(dssRegistrationLog); } @@ -249,7 +249,7 @@ public class DataSetRegistrationService<T extends DataSetInformation> implements registratorContext.getOnErrorActionDecision().computeUndoAction(errorType, ex); DataSetStorageRollbacker rollbacker = new DataSetStorageRollbacker(registratorContext, operationLog, action, - incomingDataSetFile.getRealIncomingFile(), null, ex, errorType); + incomingDataSetFile, null, ex, errorType); operationLog.info(rollbacker.getErrorMessageForLog()); rollbacker.doRollback(dssRegistrationLog); } diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v2/DataSetStorageRollbacker.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v2/DataSetStorageRollbacker.java index e6f83c01f96f598b4b48ed1b683ac67fba6e2bf3..8a69ed42f611ce956824a11fd962fb422c0b1bfb 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v2/DataSetStorageRollbacker.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v2/DataSetStorageRollbacker.java @@ -31,6 +31,7 @@ import ch.systemsx.cisd.etlserver.DssRegistrationLogger; import ch.systemsx.cisd.etlserver.FileRenamer; import ch.systemsx.cisd.etlserver.IStorageProcessorTransactional.UnstoreDataAction; import ch.systemsx.cisd.etlserver.TransferredDataSetHandler; +import ch.systemsx.cisd.etlserver.registrator.DataSetFile; import ch.systemsx.cisd.etlserver.registrator.v2.AbstractOmniscientTopLevelDataSetRegistrator.OmniscientTopLevelDataSetRegistratorState; import ch.systemsx.cisd.etlserver.registrator.v2.IDataSetOnErrorActionDecision.ErrorType; import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; @@ -50,7 +51,7 @@ public class DataSetStorageRollbacker private final UnstoreDataAction unstoreAction; - private final File incomingDataSetFile; + private final DataSetFile incomingDataSetFile; private final String dataSetTypeCodeOrNull; @@ -71,7 +72,7 @@ public class DataSetStorageRollbacker * @param errorOrNull */ public DataSetStorageRollbacker(OmniscientTopLevelDataSetRegistratorState registratorContext, - Logger operationLog, UnstoreDataAction unstoreAction, File incomingDataSetFile, + Logger operationLog, UnstoreDataAction unstoreAction, DataSetFile incomingDataSetFile, String dataSetTypeCodeOrNull, Throwable errorOrNull) { this(registratorContext, operationLog, unstoreAction, incomingDataSetFile, @@ -89,7 +90,7 @@ public class DataSetStorageRollbacker * @param errorOrNull */ public DataSetStorageRollbacker(OmniscientTopLevelDataSetRegistratorState registratorContext, - Logger operationLog, UnstoreDataAction unstoreAction, File incomingDataSetFile, + Logger operationLog, UnstoreDataAction unstoreAction, DataSetFile incomingDataSetFile, String dataSetTypeCodeOrNull, Throwable errorOrNull, ErrorType errorTypeOrNull) { super(); @@ -123,6 +124,14 @@ public class DataSetStorageRollbacker public File doRollback(DssRegistrationLogger dssRegistrationLog) { dssRegistrationLog.log(getErrorMessageForLog()); + + // delete pre-staging copy always - even if not deleting the real incoming directory + if (incomingDataSetFile.isLogicalFileSpecified()) + { + FileUtilities.deleteRecursively(incomingDataSetFile.getLogicalIncomingFile() + .getParentFile()); + } + if (unstoreAction == UnstoreDataAction.MOVE_TO_ERROR) { File newLocation = moveIncomingToError(); @@ -140,16 +149,16 @@ public class DataSetStorageRollbacker { dssRegistrationLog.log("File has been deleted."); - FileUtilities.deleteRecursively(incomingDataSetFile, + FileUtilities.deleteRecursively(incomingDataSetFile.getRealIncomingFile(), new Log4jSimpleLogger(operationLog)); return null; } StringBuilder untouchedMessage = new StringBuilder(); untouchedMessage.append("File has been left untouched "); - untouchedMessage.append(incomingDataSetFile.getAbsolutePath()); + untouchedMessage.append(incomingDataSetFile.getRealIncomingFile().getAbsolutePath()); dssRegistrationLog.log(untouchedMessage.toString()); - return incomingDataSetFile; + return incomingDataSetFile.getRealIncomingFile(); } public File moveIncomingToError() @@ -171,13 +180,14 @@ public class DataSetStorageRollbacker TransferredDataSetHandler.ERROR_DATA_STRATEGY, registratorContext .getStorageProcessor().getStoreRootDirectory(), registratorContext .getFileOperations(), dataSetInfo, dataSetInfo.getDataSetType(), - incomingDataSetFile); + incomingDataSetFile.getRealIncomingFile()); baseDirectoryHolder = new BaseDirectoryHolder(TransferredDataSetHandler.ERROR_DATA_STRATEGY, - baseDirectory, incomingDataSetFile); + baseDirectory, incomingDataSetFile.getRealIncomingFile()); // Move the incoming there - FileRenamer.renameAndLog(incomingDataSetFile, baseDirectoryHolder.getTargetFile()); + FileRenamer.renameAndLog(incomingDataSetFile.getRealIncomingFile(), + baseDirectoryHolder.getTargetFile()); return baseDirectoryHolder.getTargetFile(); } @@ -187,7 +197,7 @@ public class DataSetStorageRollbacker private void writeThrowable() { assert errorOrNull != null; - final String fileName = incomingDataSetFile.getName() + ".exception"; + final String fileName = incomingDataSetFile.getRealIncomingFile().getName() + ".exception"; final File file = new File(baseDirectoryHolder.getTargetFile().getParentFile(), fileName); FileWriter writer = null; try diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/DataSetStorageRollbackerTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/DataSetStorageRollbackerTest.java index 20ee623273d9d79b7ca5b27fcea3e9d4e063402a..e2287c63fbadc14afc8e1abfc8baf44afcd47bb5 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/DataSetStorageRollbackerTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/DataSetStorageRollbackerTest.java @@ -37,9 +37,9 @@ import ch.systemsx.cisd.etlserver.ThreadParameters; import ch.systemsx.cisd.etlserver.TopLevelDataSetRegistratorGlobalState; import ch.systemsx.cisd.etlserver.registrator.recovery.DataSetStorageRecoveryManager; import ch.systemsx.cisd.etlserver.registrator.v1.AbstractOmniscientTopLevelDataSetRegistrator; +import ch.systemsx.cisd.etlserver.registrator.v1.AbstractOmniscientTopLevelDataSetRegistrator.OmniscientTopLevelDataSetRegistratorState; import ch.systemsx.cisd.etlserver.registrator.v1.DataSetRegistrationService; import ch.systemsx.cisd.etlserver.registrator.v1.DataSetStorageRollbacker; -import ch.systemsx.cisd.etlserver.registrator.v1.AbstractOmniscientTopLevelDataSetRegistrator.OmniscientTopLevelDataSetRegistratorState; import ch.systemsx.cisd.etlserver.registrator.v1.IDataSetOnErrorActionDecision.ErrorType; import ch.systemsx.cisd.etlserver.validation.IDataSetValidator; import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; @@ -65,7 +65,7 @@ public class DataSetStorageRollbackerTest extends AbstractFileSystemTestCase private IDataSetValidator dataSetValidator; - private File incomingDataSetFile; + private DataSetFile incomingDataSetFile; private TestDataSetRegistrator testRegistrator; @@ -89,7 +89,8 @@ public class DataSetStorageRollbackerTest extends AbstractFileSystemTestCase @Test public void testLogging() { - incomingDataSetFile = createDirectory(workingDirectory, "data_set"); + File realIncoming = createDirectory(workingDirectory, "data_set"); + incomingDataSetFile = new DataSetFile(realIncoming); OmniscientTopLevelDataSetRegistratorState globalState = testRegistrator.getRegistratorState(); DataSetStorageRollbacker rollbacker =