Skip to content
Snippets Groups Projects
Commit 686d36bb authored by cramakri's avatar cramakri
Browse files

BIS-21 SP-177 : Be more robust to failures in the hardlink maker

SVN: 26073
parent 2b5de781
No related branches found
No related tags found
No related merge requests found
...@@ -33,6 +33,7 @@ import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; ...@@ -33,6 +33,7 @@ import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
import ch.systemsx.cisd.common.exceptions.NotImplementedException; import ch.systemsx.cisd.common.exceptions.NotImplementedException;
import ch.systemsx.cisd.common.exceptions.Status; import ch.systemsx.cisd.common.exceptions.Status;
import ch.systemsx.cisd.common.exceptions.UserFailureException; 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.FastRecursiveHardLinkMaker;
import ch.systemsx.cisd.common.filesystem.FileOperations; import ch.systemsx.cisd.common.filesystem.FileOperations;
import ch.systemsx.cisd.common.filesystem.FileUtilities; import ch.systemsx.cisd.common.filesystem.FileUtilities;
...@@ -384,7 +385,12 @@ public abstract class AbstractOmniscientTopLevelDataSetRegistrator<T extends Dat ...@@ -384,7 +385,12 @@ public abstract class AbstractOmniscientTopLevelDataSetRegistrator<T extends Dat
} else } else
{ {
// If we should the prestaging phase, we make a hardlink copy in prestaging area // 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); DataSetFile dsf = new DataSetFile(incomingDataSetFile, copyOfIncoming);
...@@ -397,7 +403,12 @@ public abstract class AbstractOmniscientTopLevelDataSetRegistrator<T extends Dat ...@@ -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(); TopLevelDataSetRegistratorGlobalState globalState = state.getGlobalState();
File preStagingRootDir = globalState.getPreStagingDir(); File preStagingRootDir = globalState.getPreStagingDir();
...@@ -408,7 +419,8 @@ public abstract class AbstractOmniscientTopLevelDataSetRegistrator<T extends Dat ...@@ -408,7 +419,8 @@ public abstract class AbstractOmniscientTopLevelDataSetRegistrator<T extends Dat
preStagingDir.mkdir(); preStagingDir.mkdir();
// Try to find a hardlink maker // Try to find a hardlink maker
IImmutableCopier hardlinkMaker = FastRecursiveHardLinkMaker.tryCreate(); IImmutableCopier hardlinkMaker =
new AssertionCatchingImmutableCopierWrapper(FastRecursiveHardLinkMaker.tryCreate());
boolean linkWasMade = false; boolean linkWasMade = false;
if (null != hardlinkMaker) if (null != hardlinkMaker)
{ {
...@@ -418,15 +430,22 @@ public abstract class AbstractOmniscientTopLevelDataSetRegistrator<T extends Dat ...@@ -418,15 +430,22 @@ public abstract class AbstractOmniscientTopLevelDataSetRegistrator<T extends Dat
if (status.isError()) if (status.isError())
{ {
final String msg = final String msg =
status.tryGetErrorMessage() == null ? "inknown error" : status status.tryGetErrorMessage() == null ? "Unknown error" : status
.tryGetErrorMessage(); .tryGetErrorMessage();
operationLog.warn("Failed to make a hard link copy of " + incomingDirName + " to " operationLog.warn("Failed to make a hard link copy of " + incomingDataSetFile
+ preStagingDir + ": " + msg); + " to " + preStagingDir + ": " + msg);
} }
} }
if (false == linkWasMade) 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( FileOperations.getMonitoredInstanceForCurrentThread().copyToDirectory(
incomingDataSetFile, preStagingDir); incomingDataSetFile, preStagingDir);
} }
......
...@@ -37,7 +37,6 @@ import ch.systemsx.cisd.etlserver.registrator.DataSetFile; ...@@ -37,7 +37,6 @@ import ch.systemsx.cisd.etlserver.registrator.DataSetFile;
import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationContext; import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationContext;
import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationDetails; import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationDetails;
import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationPersistentMap; 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.DataSetRegistrationService;
import ch.systemsx.cisd.etlserver.registrator.DataSetStorageAlgorithmRunner; import ch.systemsx.cisd.etlserver.registrator.DataSetStorageAlgorithmRunner;
import ch.systemsx.cisd.etlserver.registrator.IDataSetOnErrorActionDecision.ErrorType; import ch.systemsx.cisd.etlserver.registrator.IDataSetOnErrorActionDecision.ErrorType;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment