From 686d36bb5ca8a8f368d354c0825abef62e3d2898 Mon Sep 17 00:00:00 2001 From: cramakri <cramakri> Date: Wed, 11 Jul 2012 09:44:54 +0000 Subject: [PATCH] BIS-21 SP-177 : Be more robust to failures in the hardlink maker SVN: 26073 --- ...tOmniscientTopLevelDataSetRegistrator.java | 31 +++++++++++++++---- .../impl/DataSetRegistrationTransaction.java | 1 - 2 files changed, 25 insertions(+), 7 deletions(-) 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 53f3318ca59..92995f792e0 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 @@ -33,6 +33,7 @@ import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; import ch.systemsx.cisd.common.exceptions.NotImplementedException; import ch.systemsx.cisd.common.exceptions.Status; import ch.systemsx.cisd.common.exceptions.UserFailureException; +import ch.systemsx.cisd.common.filesystem.AssertionCatchingImmutableCopierWrapper; import ch.systemsx.cisd.common.filesystem.FastRecursiveHardLinkMaker; import ch.systemsx.cisd.common.filesystem.FileOperations; import ch.systemsx.cisd.common.filesystem.FileUtilities; @@ -384,7 +385,12 @@ public abstract class AbstractOmniscientTopLevelDataSetRegistrator<T extends Dat } else { // If we should the prestaging phase, we make a hardlink copy in prestaging area - File copyOfIncoming = copyIncomingFileToPreStaging(incomingDataSetFile); + File copyOfIncoming = tryCopyIncomingFileToPreStaging(incomingDataSetFile); + if (null == copyOfIncoming) + { + // Nothing to do + return; + } DataSetFile dsf = new DataSetFile(incomingDataSetFile, copyOfIncoming); @@ -397,7 +403,12 @@ public abstract class AbstractOmniscientTopLevelDataSetRegistrator<T extends Dat } } - private File copyIncomingFileToPreStaging(File incomingDataSetFile) + /** + * Make a copy of the file to the prestaging directory. + * + * @return The file in the prestaging directory or null if a copy could not be made. + */ + private File tryCopyIncomingFileToPreStaging(File incomingDataSetFile) { TopLevelDataSetRegistratorGlobalState globalState = state.getGlobalState(); File preStagingRootDir = globalState.getPreStagingDir(); @@ -408,7 +419,8 @@ public abstract class AbstractOmniscientTopLevelDataSetRegistrator<T extends Dat preStagingDir.mkdir(); // Try to find a hardlink maker - IImmutableCopier hardlinkMaker = FastRecursiveHardLinkMaker.tryCreate(); + IImmutableCopier hardlinkMaker = + new AssertionCatchingImmutableCopierWrapper(FastRecursiveHardLinkMaker.tryCreate()); boolean linkWasMade = false; if (null != hardlinkMaker) { @@ -418,15 +430,22 @@ public abstract class AbstractOmniscientTopLevelDataSetRegistrator<T extends Dat if (status.isError()) { final String msg = - status.tryGetErrorMessage() == null ? "inknown error" : status + status.tryGetErrorMessage() == null ? "Unknown error" : status .tryGetErrorMessage(); - operationLog.warn("Failed to make a hard link copy of " + incomingDirName + " to " - + preStagingDir + ": " + msg); + operationLog.warn("Failed to make a hard link copy of " + incomingDataSetFile + + " to " + preStagingDir + ": " + msg); } } if (false == linkWasMade) { + // First check if the original file still exists + if (false == incomingDataSetFile.exists()) + { + operationLog.warn(incomingDataSetFile.getAbsolutePath() + + " has been deleted. Nothing to process."); + return null; + } FileOperations.getMonitoredInstanceForCurrentThread().copyToDirectory( incomingDataSetFile, preStagingDir); } 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 fd3e3295677..c726722064b 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,7 +37,6 @@ 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; -- GitLab