diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/ETLDaemon.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/ETLDaemon.java index c5faf900464a9dc27c14c0fd64578aa899b6fb90..8b0cda24eb3ff8eb83eebf165ff60a0b582f0e03 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/ETLDaemon.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/ETLDaemon.java @@ -51,6 +51,7 @@ import ch.systemsx.cisd.common.filesystem.StoreItem; import ch.systemsx.cisd.common.highwatermark.HighwaterMarkDirectoryScanningHandler; import ch.systemsx.cisd.common.highwatermark.HighwaterMarkWatcher; import ch.systemsx.cisd.common.highwatermark.HostAwareFileWithHighwaterMark; +import ch.systemsx.cisd.common.logging.Log4jSimpleLogger; import ch.systemsx.cisd.common.logging.LogCategory; import ch.systemsx.cisd.common.logging.LogFactory; import ch.systemsx.cisd.common.mail.IMailClient; @@ -228,12 +229,13 @@ public final class ETLDaemon final IDataSourceQueryService dataSourceQueryService = ServiceProvider.getDataSourceQueryService(); File storeRootDir = DssPropertyParametersUtil.getStoreRootDir(parameters.getProperties()); - File[] shares = SegmentedStoreUtils.getShares(storeRootDir); List<String> incomingShares = new ArrayList<String>(); for (final ThreadParameters threadParameters : threads) { File incomingDataDirectory = threadParameters.getIncomingDataDirectory(); - String shareId = SegmentedStoreUtils.findIncomingShare(incomingDataDirectory, shares); + String shareId = + SegmentedStoreUtils.findIncomingShare(incomingDataDirectory, storeRootDir, + new Log4jSimpleLogger(operationLog)); incomingShares.add(shareId); operationLog.info("[" + threadParameters.getThreadName() + "]: Data sets drop into '" + incomingDataDirectory + "' will be stored in share " + shareId + "."); diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetService.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetService.java index 5ccda47e09a306d212be208615c68a28b31d3ab5..1202a271c4b157e070ca0f3a916e0d0f142ea090 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetService.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetService.java @@ -29,6 +29,7 @@ import org.apache.log4j.Logger; import ch.systemsx.cisd.base.exceptions.IOExceptionUnchecked; import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException; import ch.systemsx.cisd.common.exceptions.UserFailureException; +import ch.systemsx.cisd.common.logging.Log4jSimpleLogger; import ch.systemsx.cisd.common.mail.IMailClient; import ch.systemsx.cisd.common.mail.MailClient; import ch.systemsx.cisd.etlserver.DataStrategyStore; @@ -240,7 +241,9 @@ public class PutDataSetService + storeDirectory); } } - shareId = SegmentedStoreUtils.findIncomingShare(incomingDir, storeDirectory); + shareId = + SegmentedStoreUtils.findIncomingShare(incomingDir, storeDirectory, + new Log4jSimpleLogger(operationLog)); operationLog.info("Data sets registered via RPC are stored in share " + shareId + "."); registratorMap = initializer.getRegistratorMap(shareId, openBisService, mailClient); 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 4c1b4bec4ca5cafeb3234903e8e8723e1d71b390..9f785b36ffc025650e08e509bae25ea3cbb317e3 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 @@ -36,6 +36,7 @@ import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException; import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; 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; import ch.systemsx.cisd.common.filesystem.rsync.RsyncCopier; import ch.systemsx.cisd.common.logging.ISimpleLogger; @@ -54,6 +55,14 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.SimpleDataSetInformationDTO; */ public class SegmentedStoreUtils { + private static final IFreeSpaceProvider DUMMY_FREE_SPACE_PROVIDER = new IFreeSpaceProvider() + { + public long freeSpaceKb(HostAwareFile path) throws IOException + { + return Long.MAX_VALUE; + } + }; + private static final String RSYNC_EXEC = "rsync"; private static final Pattern SHARE_ID_PATTERN = Pattern.compile("[0-9]+"); @@ -84,7 +93,7 @@ public class SegmentedStoreUtils */ public static File[] getShares(File storeRootDir) { - File[] files = storeRootDir.listFiles(SegmentedStoreUtils.FILTER_ON_SHARES); + File[] files = storeRootDir.listFiles(FILTER_ON_SHARES); Arrays.sort(files); return files; } @@ -93,7 +102,7 @@ public class SegmentedStoreUtils * Returns first the id of the first incoming share folder of specified store root which allows * to move a file from specified incoming folder to the incoming share. */ - public static String findIncomingShare(File incomingFolder, File storeRoot) + public static String findIncomingShare(File incomingFolder, File storeRoot, ISimpleLogger logger) { if (incomingFolder.isDirectory() == false) { @@ -105,16 +114,7 @@ public class SegmentedStoreUtils throw new ConfigurationFailureException( "Store root does not exist or is not a folder: " + storeRoot); } - return findIncomingShare(incomingFolder, storeRoot.listFiles(FILTER_ON_SHARES)); - } - - /** - * Returns the name of the first share folder which allows to move a file from specified - * incoming folder to that share folder. - */ - public static String findIncomingShare(File incomingDataDirectory, File[] shares) - { - File testFile = new File(incomingDataDirectory, ".DDS_TEST"); + File testFile = new File(incomingFolder, ".DDS_TEST"); try { testFile.createNewFile(); @@ -122,20 +122,29 @@ public class SegmentedStoreUtils { throw new ConfigurationFailureException( "Couldn't create a test file in the following incoming folder: " - + incomingDataDirectory, ex); + + incomingFolder, ex); } - File matchingShare = findShare(testFile, shares); + File matchingShare = findShare(testFile, storeRoot, logger); return matchingShare.getName(); } - private static File findShare(File testFile, File[] shares) + private static File findShare(File testFile, File storeRoot, ISimpleLogger logger) { - for (File share : shares) + for (File share : getShares(storeRoot)) { File destination = new File(share, testFile.getName()); if (testFile.renameTo(destination)) { destination.delete(); + Share shareObject = + new ShareFactory().createShare(share, DUMMY_FREE_SPACE_PROVIDER, logger); + if (shareObject.isWithdrawShare()) + { + logger.log(LogLevel.WARN, "Incoming folder [" + testFile.getParent() + + "] can not be assigned to share " + shareObject.getShareId() + + " because its property " + ShareFactory.WITHDRAW_SHARE_PROP + + " is set to true."); + } return share; } } diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/ShareFactory.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/ShareFactory.java index 3e3987b4181db652884da3253fcb35b7894e722b..48bf51429aab5ae77366fa22066019b2e217ef53 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/ShareFactory.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/ShareFactory.java @@ -51,7 +51,6 @@ public class ShareFactory @Private static final String SHUFFLE_PRIORITY_PROP = "shuffle-priority"; - @Private public static final String WITHDRAW_SHARE_PROP = "withdraw-share"; private int speed = Math.abs(Constants.DEFAULT_SPEED_HINT); 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 ced01b1f3c7efe36b4bf48846abb53a55a3dd22a..501cdd3796e538ac3ff862be363c6f1f135cbe36 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 @@ -273,6 +273,25 @@ public class SegmentedStoreUtilsTest extends AbstractFileSystemTestCase log.assertNoMoreLogMessages(); } + @Test + public void testFindIncomingShare() + { + File incomingFolder = new File(workingDirectory, "incoming"); + incomingFolder.mkdirs(); + File share1 = new File(store, "1"); + share1.mkdirs(); + FileUtilities.writeToFile(new File(share1, "share.properties"), "withdraw-share = true"); + + String share = SegmentedStoreUtils.findIncomingShare(incomingFolder, store, log); + + assertEquals("1", share); + assertEquals( + "WARN: Incoming folder [targets/unit-test-wd/" + + SegmentedStoreUtilsTest.class.getName() + + "/incoming] can not be assigned to share 1 because its property " + + "withdraw-share is set to true.\n", log.toString()); + } + private File dataSetFile(String shareId, boolean empty) { File share = new File(store, shareId);