From 77a7d278601945089c3c5aae1f6d2b4021166c0c Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Wed, 5 Nov 2014 11:00:39 +0000
Subject: [PATCH] SSDM-1010: better log message, UserFailureException instead
 of IllegalArgumentException if chosen data sets from different containers.

SVN: 32737
---
 .../standard/archiver/MultiDataSetArchiver.java     |  7 ++++---
 .../generic/shared/utils/SegmentedStoreUtils.java   | 13 ++++++++++---
 .../standard/archiver/MultiDataSetArchiverTest.java |  5 +++--
 .../shared/utils/SegmentedStoreUtilsTest.java       |  8 ++++----
 4 files changed, 21 insertions(+), 12 deletions(-)

diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchiver.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchiver.java
index c40c59c755b..f6a49f885eb 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchiver.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchiver.java
@@ -31,6 +31,7 @@ import ch.rinn.restrictions.Private;
 import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException;
 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.BooleanStatus;
 import ch.systemsx.cisd.common.filesystem.FileUtilities;
 import ch.systemsx.cisd.common.filesystem.IFreeSpaceProvider;
@@ -430,7 +431,7 @@ public class MultiDataSetArchiver extends AbstractArchiverProcessingPlugin
         {
             if (physicalDataSet.isAvailable())
             {
-                throw new IllegalArgumentException("Dataset '" + physicalDataSet.getCode() + "'specified for unarchiving is available");
+                throw new UserFailureException("Dataset '" + physicalDataSet.getCode() + "'specified for unarchiving is available");
             }
         }
     }
@@ -491,7 +492,7 @@ public class MultiDataSetArchiver extends AbstractArchiverProcessingPlugin
             MultiDataSetArchiverDataSetDTO dataSet = getReadonlyQuery().getDataSetForCode(code);
             if (dataSet == null)
             {
-                throw new IllegalArgumentException("Dataset " + code
+                throw new UserFailureException("Dataset " + code
                         + " was selected for unarchiving, but is not present in the archive");
             }
             List<String> list = containers.get(dataSet.getContainerId());
@@ -505,7 +506,7 @@ public class MultiDataSetArchiver extends AbstractArchiverProcessingPlugin
         }
         if (containers.size() > 1)
         {
-            throw new IllegalArgumentException("Datasets selected for unarchiving do not all belong to one container, "
+            throw new UserFailureException("Datasets selected for unarchiving do not all belong to one container, "
                     + "but to " + containers.size() + " different containers: " + containers);
         }
         return containerId;
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtils.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtils.java
index c0db481291a..fae77c173a5 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtils.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtils.java
@@ -293,7 +293,8 @@ public class SegmentedStoreUtils
             actualFreeSpace = unarchivingScratchShare.calculateFreeSpace();
         }
         logger.log(LogLevel.INFO, "Free space on unarchiving scratch share '"
-                + unarchivingScratchShare.getShareId() + "': " + FileUtilities.byteCountToDisplaySize(actualFreeSpace)
+                + unarchivingScratchShare.getShareId() + "': " 
+                + FileUtilities.byteCountToDisplaySize(calculateNominalFreeSpace(actualFreeSpace))
                 + ", requested space for unarchiving " + filteredDataSets.size() + " data sets: "
                 + FileUtilities.byteCountToDisplaySize(requestedSpace));
     }
@@ -376,7 +377,8 @@ public class SegmentedStoreUtils
         if (isNotEnoughFreeSpace(requestedSpace, freeSpace))
         {
             throw new EnvironmentFailureException("Even after removing all removable data sets from share '"
-                    + share.getShareId() + "' there would be still only " + FileUtilities.byteCountToDisplaySize(freeSpace)
+                    + share.getShareId() + "' there would be still only " 
+                    + FileUtilities.byteCountToDisplaySize(calculateNominalFreeSpace(freeSpace))
                     + " free space which is not enough as " + FileUtilities.byteCountToDisplaySize(requestedSpace) 
                     + " is requested.");
         }
@@ -385,7 +387,12 @@ public class SegmentedStoreUtils
 
     private static boolean isNotEnoughFreeSpace(long requestedSpace, long freeSpace)
     {
-        return requestedSpace + MINIMUM_FREE_SCRATCH_SPACE >= freeSpace;
+        return requestedSpace >= calculateNominalFreeSpace(freeSpace);
+    }
+
+    private static long calculateNominalFreeSpace(long freeSpace)
+    {
+        return freeSpace - MINIMUM_FREE_SCRATCH_SPACE;
     }
 
     static List<Share> getSharesWithDataSets(File storeRoot, String dataStoreCode,
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchiverTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchiverTest.java
index 405a77c8e21..0aaf89ad76e 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchiverTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchiverTest.java
@@ -51,6 +51,7 @@ import ch.rinn.restrictions.Friend;
 import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel;
 import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase;
 import ch.systemsx.cisd.common.exceptions.Status;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.common.filesystem.FileUtilities;
 import ch.systemsx.cisd.common.filesystem.HostAwareFile;
 import ch.systemsx.cisd.common.filesystem.IFreeSpaceProvider;
@@ -834,8 +835,8 @@ public class MultiDataSetArchiverTest extends AbstractFileSystemTestCase
         try
         {
             archiver.getDataSetCodesForUnarchiving(Arrays.asList(ds1.getDataSetCode(), ds2.getDataSetCode()));
-            fail("IllegalArgumentException expected");
-        } catch (IllegalArgumentException ex)
+            fail("UserFailureException expected");
+        } catch (UserFailureException ex)
         {
             assertEquals("Datasets selected for unarchiving do not all belong to one container, "
                     + "but to 2 different containers: {0=[ds1], 1=[ds2]}", ex.getMessage());
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtilsTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtilsTest.java
index 8e455027ca7..b3fcd5f5608 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtilsTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtilsTest.java
@@ -169,7 +169,7 @@ public class SegmentedStoreUtilsTest extends AbstractFileSystemTestCase
                 shareIdManager, log);
 
         assertEquals(shareFolder.getPath(), recordingFileMatcher.recordedObject().getPath());
-        assertEquals("INFO: Free space on unarchiving scratch share '1': 13.00 GB, "
+        assertEquals("INFO: Free space on unarchiving scratch share '1': 12.00 GB, "
                 + "requested space for unarchiving 1 data sets: 11.00 GB\n", log.toString());
     }
 
@@ -206,7 +206,7 @@ public class SegmentedStoreUtilsTest extends AbstractFileSystemTestCase
                 + "INFO: Data set ds-1 at " + shareFolder + "/abc/ds-1 has been successfully deleted.\n"
                 + "INFO: The following data sets have been successfully removed from share '1' "
                 + "and their archiving status has been successfully set back to ARCHIVED: [ds-1]\n"
-                + "INFO: Free space on unarchiving scratch share '1': 23.00 GB, requested space for "
+                + "INFO: Free space on unarchiving scratch share '1': 22.00 GB, requested space for "
                 + "unarchiving 2 data sets: 21.00 GB\n", log.toString());
     }
 
@@ -245,7 +245,7 @@ public class SegmentedStoreUtilsTest extends AbstractFileSystemTestCase
                 + "INFO: Data set ds-3 at " + shareFolder + "/abc/ds-3 has been successfully deleted.\n"
                 + "INFO: The following data sets have been successfully removed from share '1' "
                 + "and their archiving status has been successfully set back to ARCHIVED: [ds-3]\n"
-                + "INFO: Free space on unarchiving scratch share '1': 25.00 GB, requested space for "
+                + "INFO: Free space on unarchiving scratch share '1': 24.00 GB, requested space for "
                 + "unarchiving 2 data sets: 21.00 GB\n", log.toString());
     }
 
@@ -272,7 +272,7 @@ public class SegmentedStoreUtilsTest extends AbstractFileSystemTestCase
         } catch (EnvironmentFailureException ex)
         {
             assertEquals("Even after removing all removable data sets from share '1' there would be "
-                    + "still only 25.00 GB free space which is not enough as 25.00 GB is requested.", ex.getMessage());
+                    + "still only 24.00 GB free space which is not enough as 25.00 GB is requested.", ex.getMessage());
         }
 
         assertEquals(shareFolder.getPath(), recordingFileMatcher.recordedObject().getPath());
-- 
GitLab