Skip to content
Snippets Groups Projects
Commit 4584eac0 authored by felmer's avatar felmer
Browse files

LMS-2435 log warning if an incoming directory is assigned to a withdraw share

SVN: 22487
parent 2a28a835
No related branches found
No related tags found
No related merge requests found
...@@ -51,6 +51,7 @@ import ch.systemsx.cisd.common.filesystem.StoreItem; ...@@ -51,6 +51,7 @@ import ch.systemsx.cisd.common.filesystem.StoreItem;
import ch.systemsx.cisd.common.highwatermark.HighwaterMarkDirectoryScanningHandler; import ch.systemsx.cisd.common.highwatermark.HighwaterMarkDirectoryScanningHandler;
import ch.systemsx.cisd.common.highwatermark.HighwaterMarkWatcher; import ch.systemsx.cisd.common.highwatermark.HighwaterMarkWatcher;
import ch.systemsx.cisd.common.highwatermark.HostAwareFileWithHighwaterMark; 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.LogCategory;
import ch.systemsx.cisd.common.logging.LogFactory; import ch.systemsx.cisd.common.logging.LogFactory;
import ch.systemsx.cisd.common.mail.IMailClient; import ch.systemsx.cisd.common.mail.IMailClient;
...@@ -228,12 +229,13 @@ public final class ETLDaemon ...@@ -228,12 +229,13 @@ public final class ETLDaemon
final IDataSourceQueryService dataSourceQueryService = final IDataSourceQueryService dataSourceQueryService =
ServiceProvider.getDataSourceQueryService(); ServiceProvider.getDataSourceQueryService();
File storeRootDir = DssPropertyParametersUtil.getStoreRootDir(parameters.getProperties()); File storeRootDir = DssPropertyParametersUtil.getStoreRootDir(parameters.getProperties());
File[] shares = SegmentedStoreUtils.getShares(storeRootDir);
List<String> incomingShares = new ArrayList<String>(); List<String> incomingShares = new ArrayList<String>();
for (final ThreadParameters threadParameters : threads) for (final ThreadParameters threadParameters : threads)
{ {
File incomingDataDirectory = threadParameters.getIncomingDataDirectory(); File incomingDataDirectory = threadParameters.getIncomingDataDirectory();
String shareId = SegmentedStoreUtils.findIncomingShare(incomingDataDirectory, shares); String shareId =
SegmentedStoreUtils.findIncomingShare(incomingDataDirectory, storeRootDir,
new Log4jSimpleLogger(operationLog));
incomingShares.add(shareId); incomingShares.add(shareId);
operationLog.info("[" + threadParameters.getThreadName() + "]: Data sets drop into '" operationLog.info("[" + threadParameters.getThreadName() + "]: Data sets drop into '"
+ incomingDataDirectory + "' will be stored in share " + shareId + "."); + incomingDataDirectory + "' will be stored in share " + shareId + ".");
......
...@@ -29,6 +29,7 @@ import org.apache.log4j.Logger; ...@@ -29,6 +29,7 @@ import org.apache.log4j.Logger;
import ch.systemsx.cisd.base.exceptions.IOExceptionUnchecked; import ch.systemsx.cisd.base.exceptions.IOExceptionUnchecked;
import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException; import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException;
import ch.systemsx.cisd.common.exceptions.UserFailureException; 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.IMailClient;
import ch.systemsx.cisd.common.mail.MailClient; import ch.systemsx.cisd.common.mail.MailClient;
import ch.systemsx.cisd.etlserver.DataStrategyStore; import ch.systemsx.cisd.etlserver.DataStrategyStore;
...@@ -240,7 +241,9 @@ public class PutDataSetService ...@@ -240,7 +241,9 @@ public class PutDataSetService
+ storeDirectory); + 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 + "."); operationLog.info("Data sets registered via RPC are stored in share " + shareId + ".");
registratorMap = initializer.getRegistratorMap(shareId, openBisService, mailClient); registratorMap = initializer.getRegistratorMap(shareId, openBisService, mailClient);
......
...@@ -36,6 +36,7 @@ import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException; ...@@ -36,6 +36,7 @@ import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException;
import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
import ch.systemsx.cisd.common.exceptions.UserFailureException; import ch.systemsx.cisd.common.exceptions.UserFailureException;
import ch.systemsx.cisd.common.filesystem.FileUtilities; 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.IFreeSpaceProvider;
import ch.systemsx.cisd.common.filesystem.rsync.RsyncCopier; import ch.systemsx.cisd.common.filesystem.rsync.RsyncCopier;
import ch.systemsx.cisd.common.logging.ISimpleLogger; import ch.systemsx.cisd.common.logging.ISimpleLogger;
...@@ -54,6 +55,14 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.SimpleDataSetInformationDTO; ...@@ -54,6 +55,14 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.SimpleDataSetInformationDTO;
*/ */
public class SegmentedStoreUtils 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 String RSYNC_EXEC = "rsync";
private static final Pattern SHARE_ID_PATTERN = Pattern.compile("[0-9]+"); private static final Pattern SHARE_ID_PATTERN = Pattern.compile("[0-9]+");
...@@ -84,7 +93,7 @@ public class SegmentedStoreUtils ...@@ -84,7 +93,7 @@ public class SegmentedStoreUtils
*/ */
public static File[] getShares(File storeRootDir) public static File[] getShares(File storeRootDir)
{ {
File[] files = storeRootDir.listFiles(SegmentedStoreUtils.FILTER_ON_SHARES); File[] files = storeRootDir.listFiles(FILTER_ON_SHARES);
Arrays.sort(files); Arrays.sort(files);
return files; return files;
} }
...@@ -93,7 +102,7 @@ public class SegmentedStoreUtils ...@@ -93,7 +102,7 @@ public class SegmentedStoreUtils
* Returns first the id of the first incoming share folder of specified store root which allows * 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. * 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) if (incomingFolder.isDirectory() == false)
{ {
...@@ -105,16 +114,7 @@ public class SegmentedStoreUtils ...@@ -105,16 +114,7 @@ public class SegmentedStoreUtils
throw new ConfigurationFailureException( throw new ConfigurationFailureException(
"Store root does not exist or is not a folder: " + storeRoot); "Store root does not exist or is not a folder: " + storeRoot);
} }
return findIncomingShare(incomingFolder, storeRoot.listFiles(FILTER_ON_SHARES)); File testFile = new File(incomingFolder, ".DDS_TEST");
}
/**
* 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");
try try
{ {
testFile.createNewFile(); testFile.createNewFile();
...@@ -122,20 +122,29 @@ public class SegmentedStoreUtils ...@@ -122,20 +122,29 @@ public class SegmentedStoreUtils
{ {
throw new ConfigurationFailureException( throw new ConfigurationFailureException(
"Couldn't create a test file in the following incoming folder: " "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(); 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()); File destination = new File(share, testFile.getName());
if (testFile.renameTo(destination)) if (testFile.renameTo(destination))
{ {
destination.delete(); 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; return share;
} }
} }
......
...@@ -51,7 +51,6 @@ public class ShareFactory ...@@ -51,7 +51,6 @@ public class ShareFactory
@Private @Private
static final String SHUFFLE_PRIORITY_PROP = "shuffle-priority"; static final String SHUFFLE_PRIORITY_PROP = "shuffle-priority";
@Private
public static final String WITHDRAW_SHARE_PROP = "withdraw-share"; public static final String WITHDRAW_SHARE_PROP = "withdraw-share";
private int speed = Math.abs(Constants.DEFAULT_SPEED_HINT); private int speed = Math.abs(Constants.DEFAULT_SPEED_HINT);
......
...@@ -273,6 +273,25 @@ public class SegmentedStoreUtilsTest extends AbstractFileSystemTestCase ...@@ -273,6 +273,25 @@ public class SegmentedStoreUtilsTest extends AbstractFileSystemTestCase
log.assertNoMoreLogMessages(); 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) private File dataSetFile(String shareId, boolean empty)
{ {
File share = new File(store, shareId); File share = new File(store, shareId);
......
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