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