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 d48f91516d10f12c1d264f39c585c29fb95da9f9..3d2237fb09913899d2fed707e279aae7f33948f9 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/ETLDaemon.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/ETLDaemon.java @@ -326,13 +326,14 @@ public final class ETLDaemon final boolean notifySuccessfulRegistration) { final File storeRootDir = DssPropertyParametersUtil.getStoreRootDir(properties); + File dssInternalTempDir = DssPropertyParametersUtil.getDssInternalTempDir(properties); migrateStoreRootDir(storeRootDir, openBISService.getHomeDatabaseInstance()); String dssCode = DssPropertyParametersUtil.getDataStoreCode(properties); TopLevelDataSetRegistratorGlobalState globalState = new TopLevelDataSetRegistratorGlobalState(dssCode, shareId, storeRootDir, - openBISService, mailClient, dataSetValidator, dataSourceQueryService, - new DynamicTransactionQueryFactory(), notifySuccessfulRegistration, - threadParameters); + dssInternalTempDir, openBISService, mailClient, dataSetValidator, + dataSourceQueryService, new DynamicTransactionQueryFactory(), + notifySuccessfulRegistration, threadParameters); ITopLevelDataSetRegistrator registrator = ClassUtils.create(ITopLevelDataSetRegistrator.class, threadParameters @@ -356,15 +357,16 @@ public final class ETLDaemon Class<?> defaultTopLevelDataSetRegistratorClass) { final File storeRootDir = DssPropertyParametersUtil.getStoreRootDir(properties); + File dssInternalTempDir = DssPropertyParametersUtil.getDssInternalTempDir(properties); migrateStoreRootDir(storeRootDir, openBISService.getHomeDatabaseInstance()); String dssCode = DssPropertyParametersUtil.getDataStoreCode(properties); TopLevelDataSetRegistratorGlobalState globalState = new TopLevelDataSetRegistratorGlobalState(dssCode, shareId, storeRootDir, - openBISService, mailClient, dataSetValidator, dataSourceQueryService, - new DynamicTransactionQueryFactory(), notifySuccessfulRegistration, - threadParameters, useIsFinishedMarkerFile, deleteUnidentified, - preRegistrationScriptOrNull, postRegistrationScriptOrNull, - validationScriptsOrNull); + dssInternalTempDir, openBISService, mailClient, dataSetValidator, + dataSourceQueryService, new DynamicTransactionQueryFactory(), + notifySuccessfulRegistration, threadParameters, useIsFinishedMarkerFile, + deleteUnidentified, preRegistrationScriptOrNull, + postRegistrationScriptOrNull, validationScriptsOrNull); ITopLevelDataSetRegistrator registrator = ClassUtils diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/TopLevelDataSetRegistratorGlobalState.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/TopLevelDataSetRegistratorGlobalState.java index 59c86bd84d9c5e5dc00fa031514fcb71c2ebed7c..4eea2ca41646b2d13712b0edb0fd8f39047c0cc9 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/TopLevelDataSetRegistratorGlobalState.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/TopLevelDataSetRegistratorGlobalState.java @@ -48,6 +48,8 @@ public class TopLevelDataSetRegistratorGlobalState private final File storeRootDir; + private final File dssInternalTempDir; + private final IEncapsulatedOpenBISService openBisService; private final IMailClient mailClient; @@ -85,13 +87,14 @@ public class TopLevelDataSetRegistratorGlobalState * @param threadParameters */ public TopLevelDataSetRegistratorGlobalState(String dssCode, String shareId, File storeRootDir, - IEncapsulatedOpenBISService openBisService, IMailClient mailClient, - IDataSetValidator dataSetValidator, IDataSourceQueryService dataSourceQueryService, + File dssInternalTempDir, IEncapsulatedOpenBISService openBisService, + IMailClient mailClient, IDataSetValidator dataSetValidator, + IDataSourceQueryService dataSourceQueryService, DynamicTransactionQueryFactory dynamicTransactionQueryFactory, boolean notifySuccessfulRegistration, ThreadParameters threadParameters) { - this(dssCode, shareId, storeRootDir, openBisService, mailClient, dataSetValidator, - dataSourceQueryService, dynamicTransactionQueryFactory, + this(dssCode, shareId, storeRootDir, dssInternalTempDir, openBisService, mailClient, + dataSetValidator, dataSourceQueryService, dynamicTransactionQueryFactory, notifySuccessfulRegistration, threadParameters, threadParameters .useIsFinishedMarkerFile(), threadParameters.deleteUnidentified(), threadParameters.tryGetPreRegistrationScript(), threadParameters @@ -99,8 +102,9 @@ public class TopLevelDataSetRegistratorGlobalState } public TopLevelDataSetRegistratorGlobalState(String dssCode, String shareId, File storeRootDir, - IEncapsulatedOpenBISService openBisService, IMailClient mailClient, - IDataSetValidator dataSetValidator, IDataSourceQueryService dataSourceQueryService, + File dssInternalTempDir, IEncapsulatedOpenBISService openBisService, + IMailClient mailClient, IDataSetValidator dataSetValidator, + IDataSourceQueryService dataSourceQueryService, DynamicTransactionQueryFactory dynamicTransactionQueryFactory, boolean notifySuccessfulRegistration, ThreadParameters threadParameters, boolean useIsFinishedMarkerFile, boolean deleteUnidentified, @@ -111,6 +115,7 @@ public class TopLevelDataSetRegistratorGlobalState this.dssCode = dssCode; this.shareId = shareId; this.storeRootDir = storeRootDir; + this.dssInternalTempDir = dssInternalTempDir; this.openBisService = openBisService; this.mailClient = mailClient; this.dataSetValidator = dataSetValidator; @@ -140,6 +145,14 @@ public class TopLevelDataSetRegistratorGlobalState return storeRootDir; } + /** + * Get a directory that can be used for temporary files, and is local to the server. + */ + public File getDssInternalTempDir() + { + return dssInternalTempDir; + } + public IEncapsulatedOpenBISService getOpenBisService() { return openBisService; 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 1760346d142f3bad2f518e317b5dc8404d90b9d5..3ba071c406db252ebe4a15159a1ece949ed9f15b 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 @@ -236,7 +236,8 @@ public abstract class AbstractOmniscientTopLevelDataSetRegistrator<T extends Dat new ReentrantLock(), FileOperations.getMonitoredInstanceForCurrentThread(), onErrorDecision); - DataSetRegistrationTransaction.rollbackDeadTransactions(globalState.getStoreRootDir()); + DataSetRegistrationTransaction.rollbackDeadTransactions(globalState + .getDssInternalTempDir()); } diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetRegistrationService.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetRegistrationService.java index c32f960d40c8aa8f1fe59bbc3860258595d199ba..ab8862d86ab842a31f3c7a7ec53c20c449661088 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetRegistrationService.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetRegistrationService.java @@ -147,7 +147,7 @@ public class DataSetRegistrationService<T extends DataSetInformation> implements // Clone this service for the transaction to keep them independent DataSetRegistrationTransaction<T> transaction = new DataSetRegistrationTransaction<T>(registrator.getGlobalState() - .getStoreRootDir(), workingDirectory, stagingDirectory, this, + .getDssInternalTempDir(), workingDirectory, stagingDirectory, this, detailsFactory); transactions.add(transaction); diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ConfigParameters.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ConfigParameters.java index 63f06d1e1a42be45305dfa5e6784212ce241b899..d568b8039e33ef6c3485999a037ea10dc03c1eb0 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ConfigParameters.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ConfigParameters.java @@ -32,6 +32,7 @@ import ch.systemsx.cisd.common.utilities.PropertyParametersUtil; import ch.systemsx.cisd.common.utilities.PropertyParametersUtil.SectionProperties; import ch.systemsx.cisd.common.utilities.PropertyUtils; import ch.systemsx.cisd.openbis.dss.generic.shared.dto.PluginServletConfig; +import ch.systemsx.cisd.openbis.dss.generic.shared.utils.DssPropertyParametersUtil; /** * Configuration parameters for the Data Set Download Server. @@ -97,6 +98,8 @@ public final class ConfigParameters implements IServletPropertiesManager private final File storePath; + private final File dssInternalTempDir; + private final File rpcIncomingDirectory; private final int port; @@ -136,6 +139,7 @@ public final class ConfigParameters implements IServletPropertiesManager { this.properties = properties; storePath = new File(PropertyUtils.getMandatoryProperty(properties, STOREROOT_DIR_KEY)); + dssInternalTempDir = getInternalTempDirectory(properties); rpcIncomingDirectory = getRpcIncomingDirectory(properties); port = getMandatoryIntegerProperty(properties, PORT_KEY); serverURL = PropertyUtils.getMandatoryProperty(properties, SERVER_URL_KEY); @@ -162,14 +166,19 @@ public final class ConfigParameters implements IServletPropertiesManager DEFAULT_AUTH_CACHE_CLEANUP_TIMER_PERIOD_MINS); pluginServlets = new LinkedHashMap<String, PluginServletConfig>(); SectionProperties[] pluginServicesProperties = - PropertyParametersUtil.extractSectionProperties(properties, - PLUGIN_SERVICES_LIST_KEY, false); + PropertyParametersUtil.extractSectionProperties(properties, + PLUGIN_SERVICES_LIST_KEY, false); addServletsProperties("", pluginServicesProperties); webstartJarPath = PropertyUtils.getProperty(properties, WEBSTART_JAR_PATH, WEBSTART_JAR_PATH_DEFAULT); } + private File getInternalTempDirectory(Properties properties) + { + return DssPropertyParametersUtil.getDssInternalTempDir(properties); + } + private static File getRpcIncomingDirectory(final Properties properties) { String incomingDirPath = PropertyUtils.getProperty(properties, RPC_INCOMING_DIR); @@ -233,6 +242,11 @@ public final class ConfigParameters implements IServletPropertiesManager return rpcIncomingDirectory; } + public File getDssInternalTempDir() + { + return dssInternalTempDir; + } + public final int getPort() { return port; @@ -308,6 +322,7 @@ public final class ConfigParameters implements IServletPropertiesManager if (operationLog.isInfoEnabled()) { operationLog.info(String.format("Store root directory: '%s'.", storePath)); + operationLog.info(String.format("Temp file directory: '%s'.", dssInternalTempDir)); operationLog.info(String.format("RPC incoming directory: '%s'.", rpcIncomingDirectory)); operationLog.info(String.format("Port number: %d.", port)); operationLog.info(String.format("URL of openBIS server: '%s'.", serverURL)); diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/DssPropertyParametersUtil.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/DssPropertyParametersUtil.java index eb0b16594c5e65603d0ed7cd9541f51f701f2f71..5f5640d3c1ab62b0806517ab2146c89cea0dd62a 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/DssPropertyParametersUtil.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/DssPropertyParametersUtil.java @@ -21,6 +21,7 @@ import java.util.Map.Entry; import java.util.Properties; import java.util.Set; +import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException; import ch.systemsx.cisd.common.filesystem.FileUtilities; import ch.systemsx.cisd.common.utilities.ExtendedProperties; import ch.systemsx.cisd.common.utilities.PropertyUtils; @@ -43,6 +44,11 @@ public class DssPropertyParametersUtil public static final String SERVER_URL_KEY = "server-url"; + /** + * Temp directory for dss usage. + */ + static final String DSS_TEMP_DIR_PATH = "dss-temp-dir"; + /** Location of service properties file. */ public static final String SERVICE_PROPERTIES_FILE = "etc/service.properties"; @@ -57,7 +63,8 @@ public class DssPropertyParametersUtil Properties properties = PropertyUtils.loadProperties(filePath); Properties systemProperties = System.getProperties(); ExtendedProperties dssSystemProperties = - ExtendedProperties.getSubset(systemProperties, OPENBIS_DSS_SYSTEM_PROPERTIES_PREFIX, true); + ExtendedProperties.getSubset(systemProperties, + OPENBIS_DSS_SYSTEM_PROPERTIES_PREFIX, true); Set<Entry<Object, Object>> entrySet = dssSystemProperties.entrySet(); for (Entry<Object, Object> entry : entrySet) { @@ -81,4 +88,23 @@ public class DssPropertyParametersUtil { return PropertyUtils.getMandatoryProperty(serviceProperties, SERVER_URL_KEY); } + + public static File getDssInternalTempDir(final Properties properties) + { + String defaultTempDirPath = + new File(System.getProperty("user.dir"), "dss-tmp").getAbsolutePath(); + String tempDirPath = + PropertyUtils.getProperty(properties, DSS_TEMP_DIR_PATH, defaultTempDirPath); + File tempDir = new File(tempDirPath); + tempDir.mkdirs(); + if (false == tempDir.exists()) + { + throw new ConfigurationFailureException( + "Could not create an internal temp directory for the data store server at path: " + + tempDir.getPath() + + ". Please make sure this directory exists and is writable by the data store server or provide an alternate using directory for the " + + DSS_TEMP_DIR_PATH + " configuration setting"); + } + return tempDir; + } } diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandlerTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandlerTest.java index 826dcb9c39fdbb894cd7c9d55edb0e9c46389596..b7caa65e228dde94cc3b62f8e24c15e293e6c9fa 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandlerTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandlerTest.java @@ -287,8 +287,9 @@ public final class TransferredDataSetHandlerTest extends AbstractFileSystemTestC TopLevelDataSetRegistratorGlobalState globalState = new TopLevelDataSetRegistratorGlobalState("dss", ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID, - workingDirectory, authorizedLimsService, mailClient, dataSetValidator, - null, new DynamicTransactionQueryFactory(), true, threadParameters); + workingDirectory, workingDirectory, authorizedLimsService, mailClient, + dataSetValidator, null, new DynamicTransactionQueryFactory(), true, + threadParameters); context.checking(new Expectations() { @@ -806,8 +807,9 @@ public final class TransferredDataSetHandlerTest extends AbstractFileSystemTestC TopLevelDataSetRegistratorGlobalState globalState = new TopLevelDataSetRegistratorGlobalState("dss", ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID, - workingDirectory, authorizedLimsService, mailClient, dataSetValidator, - null, new DynamicTransactionQueryFactory(), true, threadParameters); + workingDirectory, workingDirectory, authorizedLimsService, mailClient, + dataSetValidator, null, new DynamicTransactionQueryFactory(), true, + threadParameters); context.checking(new Expectations() { { diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/AbstractJythonDataSetHandlerTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/AbstractJythonDataSetHandlerTest.java index 440479560246ce91a8549ae5b223fcab0845136d..6034333437fcdc976c24b79c2b89145d770ff371 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/AbstractJythonDataSetHandlerTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/AbstractJythonDataSetHandlerTest.java @@ -173,8 +173,8 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste TopLevelDataSetRegistratorGlobalState globalState = new TopLevelDataSetRegistratorGlobalState("dss", ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID, - workingDirectory, openBisService, mailClient, dataSetValidator, - dataSourceQueryService, myFactory, true, threadParameters); + workingDirectory, workingDirectory, openBisService, mailClient, + dataSetValidator, dataSourceQueryService, myFactory, true, threadParameters); return globalState; } diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/DataSetStorageRollbackerTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/DataSetStorageRollbackerTest.java index f3e1832298bc12d5c00488e8dc91e8cb0345a30f..43dffe1af828eea4968617300c1eed0473edc46c 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/DataSetStorageRollbackerTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/DataSetStorageRollbackerTest.java @@ -111,8 +111,9 @@ public class DataSetStorageRollbackerTest extends AbstractFileSystemTestCase TopLevelDataSetRegistratorGlobalState globalState = new TopLevelDataSetRegistratorGlobalState("dss", ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID, - workingDirectory, openBisService, mailClient, dataSetValidator, null, - new DynamicTransactionQueryFactory(), true, threadParameters); + workingDirectory, workingDirectory, openBisService, mailClient, + dataSetValidator, null, new DynamicTransactionQueryFactory(), true, + threadParameters); return globalState; } diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransactionTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransactionTest.java index 4df92f78de45aebd653c9f4f5dffc867cca82ff9..130a17d29ba9a873c338562708d82729ad313baf 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransactionTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransactionTest.java @@ -421,8 +421,9 @@ public class DataSetRegistrationTransactionTest extends AbstractFileSystemTestCa TopLevelDataSetRegistratorGlobalState globalState = new TopLevelDataSetRegistratorGlobalState("dss", ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID, - workingDirectory, openBisService, mailClient, dataSetValidator, null, - new DynamicTransactionQueryFactory(), true, threadParameters); + workingDirectory, workingDirectory, openBisService, mailClient, + dataSetValidator, null, new DynamicTransactionQueryFactory(), true, + threadParameters); return globalState; }