Skip to content
Snippets Groups Projects
Commit 9c59fd22 authored by pkupczyk's avatar pkupczyk
Browse files

SP-18 / BIS-20: Ensure a dataset is only deleted on the DSS when it was...

SP-18 / BIS-20: Ensure a dataset is only deleted on the DSS when it was successfully deleted in the AS database

SVN: 25154
parent d69e6636
No related branches found
No related tags found
No related merge requests found
...@@ -68,6 +68,7 @@ import ch.systemsx.cisd.common.utilities.ISelfTestable; ...@@ -68,6 +68,7 @@ import ch.systemsx.cisd.common.utilities.ISelfTestable;
import ch.systemsx.cisd.common.utilities.IStopSignaler; import ch.systemsx.cisd.common.utilities.IStopSignaler;
import ch.systemsx.cisd.common.utilities.PropertyUtils; import ch.systemsx.cisd.common.utilities.PropertyUtils;
import ch.systemsx.cisd.common.utilities.SystemExit; import ch.systemsx.cisd.common.utilities.SystemExit;
import ch.systemsx.cisd.etlserver.plugins.DeleteDataSetsAlreadyDeletedInApplicationServerMaintenanceTask;
import ch.systemsx.cisd.etlserver.postregistration.PostRegistrationMaintenanceTask; import ch.systemsx.cisd.etlserver.postregistration.PostRegistrationMaintenanceTask;
import ch.systemsx.cisd.etlserver.validation.DataSetValidator; import ch.systemsx.cisd.etlserver.validation.DataSetValidator;
import ch.systemsx.cisd.etlserver.validation.IDataSetValidator; import ch.systemsx.cisd.etlserver.validation.IDataSetValidator;
...@@ -241,8 +242,8 @@ public final class ETLDaemon ...@@ -241,8 +242,8 @@ public final class ETLDaemon
File incomingDataDirectory = threadParameters.getIncomingDataDirectory(); File incomingDataDirectory = threadParameters.getIncomingDataDirectory();
ITopLevelDataSetRegistrator topLevelRegistrator = ITopLevelDataSetRegistrator topLevelRegistrator =
createProcessingThread(parameters, threadParameters, openBISService, createProcessingThread(parameters, threadParameters, openBISService,
highwaterMarkWatcher, mailClient, dataSetValidator, dataSourceQueryService, highwaterMarkWatcher, mailClient, dataSetValidator,
notifySuccessfulRegistration); dataSourceQueryService, notifySuccessfulRegistration);
operationLog.info("[" + threadParameters.getThreadName() + "]: Data sets drop into '" operationLog.info("[" + threadParameters.getThreadName() + "]: Data sets drop into '"
+ incomingDataDirectory + "' will be stored in share " + incomingDataDirectory + "' will be stored in share "
+ topLevelRegistrator.getGlobalState().getShareId() + "."); + topLevelRegistrator.getGlobalState().getShareId() + ".");
...@@ -309,8 +310,7 @@ public final class ETLDaemon ...@@ -309,8 +310,7 @@ public final class ETLDaemon
} }
private final static ITopLevelDataSetRegistrator createProcessingThread( private final static ITopLevelDataSetRegistrator createProcessingThread(
final Parameters parameters, final Parameters parameters, final ThreadParameters threadParameters,
final ThreadParameters threadParameters,
final IEncapsulatedOpenBISService authorizedLimsService, final IEncapsulatedOpenBISService authorizedLimsService,
final HighwaterMarkWatcher highwaterMarkWatcher, final IMailClient mailClient, final HighwaterMarkWatcher highwaterMarkWatcher, final IMailClient mailClient,
final IDataSetValidator dataSetValidator, final IDataSetValidator dataSetValidator,
...@@ -358,8 +358,9 @@ public final class ETLDaemon ...@@ -358,8 +358,9 @@ public final class ETLDaemon
private final String shareId; private final String shareId;
public TopLevelDataSetRegistratorInititializationData( public TopLevelDataSetRegistratorInititializationData(final Properties properties,
final Properties properties, final ThreadParameters threadParameters, final IEncapsulatedOpenBISService openBISService) final ThreadParameters threadParameters,
final IEncapsulatedOpenBISService openBISService)
{ {
storeRootDir = DssPropertyParametersUtil.getStoreRootDir(properties); storeRootDir = DssPropertyParametersUtil.getStoreRootDir(properties);
migrateStoreRootDir(storeRootDir, openBISService.getHomeDatabaseInstance()); migrateStoreRootDir(storeRootDir, openBISService.getHomeDatabaseInstance());
...@@ -378,13 +379,18 @@ public final class ETLDaemon ...@@ -378,13 +379,18 @@ public final class ETLDaemon
IDataSourceQueryService dataSourceQueryService, IDataSourceQueryService dataSourceQueryService,
final boolean notifySuccessfulRegistration) final boolean notifySuccessfulRegistration)
{ {
TopLevelDataSetRegistratorInititializationData initializationData = new TopLevelDataSetRegistratorInititializationData(properties, threadParameters, openBISService); TopLevelDataSetRegistratorInititializationData initializationData =
new TopLevelDataSetRegistratorInititializationData(properties, threadParameters,
openBISService);
TopLevelDataSetRegistratorGlobalState globalState = TopLevelDataSetRegistratorGlobalState globalState =
new TopLevelDataSetRegistratorGlobalState(initializationData.dssCode, initializationData.shareId, initializationData.storeRootDir, new TopLevelDataSetRegistratorGlobalState(initializationData.dssCode,
initializationData.dssInternalTempDir, initializationData.dssRegistrationLogDir, openBISService, mailClient, dataSetValidator, initializationData.shareId, initializationData.storeRootDir,
dataSourceQueryService, new DynamicTransactionQueryFactory(), initializationData.dssInternalTempDir,
notifySuccessfulRegistration, threadParameters); initializationData.dssRegistrationLogDir, openBISService, mailClient,
dataSetValidator, dataSourceQueryService,
new DynamicTransactionQueryFactory(), notifySuccessfulRegistration,
threadParameters);
ITopLevelDataSetRegistrator registrator = ITopLevelDataSetRegistrator registrator =
ClassUtils.create(ITopLevelDataSetRegistrator.class, threadParameters ClassUtils.create(ITopLevelDataSetRegistrator.class, threadParameters
...@@ -407,15 +413,20 @@ public final class ETLDaemon ...@@ -407,15 +413,20 @@ public final class ETLDaemon
String postRegistrationScriptOrNull, String[] validationScriptsOrNull, String postRegistrationScriptOrNull, String[] validationScriptsOrNull,
Class<?> defaultTopLevelDataSetRegistratorClass) Class<?> defaultTopLevelDataSetRegistratorClass)
{ {
TopLevelDataSetRegistratorInititializationData initializationData = new TopLevelDataSetRegistratorInititializationData(properties, threadParameters, openBISService); TopLevelDataSetRegistratorInititializationData initializationData =
new TopLevelDataSetRegistratorInititializationData(properties, threadParameters,
openBISService);
TopLevelDataSetRegistratorGlobalState globalState = TopLevelDataSetRegistratorGlobalState globalState =
new TopLevelDataSetRegistratorGlobalState(initializationData.dssCode, initializationData.shareId, initializationData.storeRootDir, new TopLevelDataSetRegistratorGlobalState(initializationData.dssCode,
initializationData.dssInternalTempDir, initializationData.dssRegistrationLogDir, openBISService, mailClient, dataSetValidator, initializationData.shareId, initializationData.storeRootDir,
dataSourceQueryService, new DynamicTransactionQueryFactory(), initializationData.dssInternalTempDir,
notifySuccessfulRegistration, threadParameters, useIsFinishedMarkerFile, initializationData.dssRegistrationLogDir, openBISService, mailClient,
deleteUnidentified, preRegistrationScriptOrNull, dataSetValidator, dataSourceQueryService,
postRegistrationScriptOrNull, validationScriptsOrNull); new DynamicTransactionQueryFactory(), notifySuccessfulRegistration,
threadParameters, useIsFinishedMarkerFile, deleteUnidentified,
preRegistrationScriptOrNull, postRegistrationScriptOrNull,
validationScriptsOrNull);
ITopLevelDataSetRegistrator registrator = ITopLevelDataSetRegistrator registrator =
ClassUtils ClassUtils
...@@ -617,7 +628,9 @@ public final class ETLDaemon ...@@ -617,7 +628,9 @@ public final class ETLDaemon
MaintenanceTaskParameters[] maintenancePlugins = parameters.getMaintenancePlugins(); MaintenanceTaskParameters[] maintenancePlugins = parameters.getMaintenancePlugins();
assertNotMoreThanOnePostRegistrationMaintenanceTask(maintenancePlugins); assertNotMoreThanOnePostRegistrationMaintenanceTask(maintenancePlugins);
MaintenanceTaskUtils.startupMaintenancePlugins(maintenancePlugins); MaintenanceTaskUtils.startupMaintenancePlugins(maintenancePlugins);
injectPostRegistrationMaintenanceTaskIfNecessary(maintenancePlugins); injectPostRegistrationMaintenanceTaskIfNecessary(maintenancePlugins);
injectDeleteDataSetsAlreadyDeletedInApplicationServerMaintenanceTaskIfNecessary(maintenancePlugins);
operationLog.info("Data Store Server ready and waiting for data."); operationLog.info("Data Store Server ready and waiting for data.");
} }
...@@ -652,18 +665,10 @@ public final class ETLDaemon ...@@ -652,18 +665,10 @@ public final class ETLDaemon
* In order for the post registration queue table in the database to be cleared, there must be a * In order for the post registration queue table in the database to be cleared, there must be a
* post registration maintenance task. * post registration maintenance task.
*/ */
private static void injectPostRegistrationMaintenanceTaskIfNecessary(MaintenanceTaskParameters[] maintenancePlugins) private static void injectPostRegistrationMaintenanceTaskIfNecessary(
MaintenanceTaskParameters[] maintenancePlugins)
{ {
boolean hasPostRegistrationMaintenanceTask = false; if (hasMaintenanceTaskOfClass(maintenancePlugins, PostRegistrationMaintenanceTask.class))
for (MaintenanceTaskParameters task : maintenancePlugins)
{
if (PostRegistrationMaintenanceTask.class.getName().equals(task.getClassName()))
{
hasPostRegistrationMaintenanceTask = true;
}
}
if (hasPostRegistrationMaintenanceTask)
{ {
// Nothing additional to do. // Nothing additional to do.
return; return;
...@@ -673,14 +678,52 @@ public final class ETLDaemon ...@@ -673,14 +678,52 @@ public final class ETLDaemon
Properties props = new Properties(); Properties props = new Properties();
props.setProperty(MaintenanceTaskParameters.CLASS_KEY, task.getClass().getName()); props.setProperty(MaintenanceTaskParameters.CLASS_KEY, task.getClass().getName());
// Have the task run every second // Have the task run every second
props.setProperty(MaintenanceTaskParameters.INTERVAL_KEY, Integer.toString(INJECTED_POST_REGISTRATION_TASK_INTERVAL)); props.setProperty(MaintenanceTaskParameters.INTERVAL_KEY,
MaintenanceTaskParameters parameters = new MaintenanceTaskParameters(props, "injected-post-registration-task"); Integer.toString(INJECTED_POST_REGISTRATION_TASK_INTERVAL));
MaintenanceTaskParameters parameters =
new MaintenanceTaskParameters(props, "injected-post-registration-task");
task.setUpEmpty(); task.setUpEmpty();
MaintenancePlugin plugin = new MaintenancePlugin(task, parameters); MaintenancePlugin plugin = new MaintenancePlugin(task, parameters);
MaintenanceTaskUtils.injectMaintenancePlugin(plugin); MaintenanceTaskUtils.injectMaintenancePlugin(plugin);
} }
private static void injectDeleteDataSetsAlreadyDeletedInApplicationServerMaintenanceTaskIfNecessary(
MaintenanceTaskParameters[] maintenancePlugins)
{
if (hasMaintenanceTaskOfClass(maintenancePlugins,
DeleteDataSetsAlreadyDeletedInApplicationServerMaintenanceTask.class))
{
// Nothing additional to do.
return;
}
Properties props = new Properties();
props.setProperty(MaintenanceTaskParameters.CLASS_KEY,
DeleteDataSetsAlreadyDeletedInApplicationServerMaintenanceTask.class.getName());
props.setProperty(MaintenanceTaskParameters.INTERVAL_KEY, Integer.toString(300));
MaintenanceTaskParameters parameters =
new MaintenanceTaskParameters(props,
"injected-delete-datasets-already-deleted-from-application-server-task");
MaintenancePlugin plugin = new MaintenancePlugin(parameters);
MaintenanceTaskUtils.injectMaintenancePlugin(plugin);
}
private static boolean hasMaintenanceTaskOfClass(MaintenanceTaskParameters[] tasks,
Class<?> taskClass)
{
for (MaintenanceTaskParameters task : tasks)
{
if (taskClass.getName().equals(task.getClassName()))
{
return true;
}
}
return false;
}
/** /**
* Runs ETL Daemon for system testing: Replaces default {@link IExitHandler} by a one which * Runs ETL Daemon for system testing: Replaces default {@link IExitHandler} by a one which
* throws an {@link AssertionError}. * throws an {@link AssertionError}.
......
...@@ -47,7 +47,7 @@ public class DeleteDataSetsAlreadyDeletedInApplicationServerMaintenanceTask exte ...@@ -47,7 +47,7 @@ public class DeleteDataSetsAlreadyDeletedInApplicationServerMaintenanceTask exte
private static final String LAST_SEEN_DATA_SET_FILE_PROPERTY = "last-seen-data-set-file"; private static final String LAST_SEEN_DATA_SET_FILE_PROPERTY = "last-seen-data-set-file";
private static final String LAST_SEEN_DATA_SET_FILE_DEFAULT = private static final String LAST_SEEN_DATA_SET_FILE_DEFAULT =
"delete-datasets-already-deleted-from-application-server.txt"; "deleteDatasetsAlreadyDeletedFromApplicationServerTaskLastSeen";
private File lastSeenDataSetFile; private File lastSeenDataSetFile;
...@@ -57,10 +57,16 @@ public class DeleteDataSetsAlreadyDeletedInApplicationServerMaintenanceTask exte ...@@ -57,10 +57,16 @@ public class DeleteDataSetsAlreadyDeletedInApplicationServerMaintenanceTask exte
super.setUp(pluginName, properties); super.setUp(pluginName, properties);
String lastSeenDataSetFileProperty = String lastSeenDataSetFileProperty =
properties.getProperty(LAST_SEEN_DATA_SET_FILE_PROPERTY, properties.getProperty(LAST_SEEN_DATA_SET_FILE_PROPERTY);
LAST_SEEN_DATA_SET_FILE_DEFAULT);
lastSeenDataSetFile = new File(lastSeenDataSetFileProperty); if (lastSeenDataSetFileProperty == null)
{
lastSeenDataSetFile =
new File(getConfigProvider().getStoreRoot(), LAST_SEEN_DATA_SET_FILE_DEFAULT);
} else
{
lastSeenDataSetFile = new File(lastSeenDataSetFileProperty);
}
} }
@Override @Override
...@@ -133,12 +139,16 @@ public class DeleteDataSetsAlreadyDeletedInApplicationServerMaintenanceTask exte ...@@ -133,12 +139,16 @@ public class DeleteDataSetsAlreadyDeletedInApplicationServerMaintenanceTask exte
{ {
if (isUnknownDatasets(dataset)) if (isUnknownDatasets(dataset))
{ {
operationLog.info("Is going to delete an unknown data set: " + dataset.getCode());
File datasetDir = File datasetDir =
getDirectoryProvider().getDataSetDirectory(dataset.getShareIdOrNull(), getDirectoryProvider().getDataSetDirectory(dataset.getShareIdOrNull(),
dataset.getLocationOrNull()); dataset.getLocationOrNull());
SegmentedStoreUtils.deleteDataSetInstantly(dataset.getCode(), datasetDir, logger); if (datasetDir.exists())
{
operationLog.info("Is going to delete an unknown data set: "
+ dataset.getCode());
SegmentedStoreUtils.deleteDataSetInstantly(dataset.getCode(), datasetDir,
logger);
}
} }
} }
} }
......
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