From 07615a4661b44b182aee481f8cef45cbadb233db Mon Sep 17 00:00:00 2001 From: jakubs <jakubs> Date: Fri, 11 Jan 2013 15:43:22 +0000 Subject: [PATCH] SP-461 BIS-293 delete pre-staging directory on registration failure SVN: 28064 --- .../etlserver/registrator/DataSetFile.java | 9 +++++- ...tOmniscientTopLevelDataSetRegistrator.java | 7 ++--- .../v1/DataSetRegistrationService.java | 4 +-- .../v1/DataSetStorageRollbacker.java | 30 ++++++++++++------- ...tOmniscientTopLevelDataSetRegistrator.java | 6 ++-- ...actProgrammableTopLevelDataSetHandler.java | 4 +-- .../v2/DataSetRegistrationService.java | 4 +-- .../v2/DataSetStorageRollbacker.java | 30 ++++++++++++------- .../DataSetStorageRollbackerTest.java | 7 +++-- 9 files changed, 63 insertions(+), 38 deletions(-) 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 a5a072e7553..2b17954badd 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 cce088c64ed..6afedcc0e5d 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 6543c7e53d3..b51e468894f 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 f2e340079ca..b936c974311 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 798903b795f..b9a0bd24a9f 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 50bfc19a34a..38bf43f4ef7 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 18d7fd75505..9f5c98f2d4c 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 e6f83c01f96..8a69ed42f61 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 20ee623273d..e2287c63fba 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 = -- GitLab