Skip to content
Snippets Groups Projects
Commit 9bb94762 authored by felmer's avatar felmer
Browse files

LMS-1612 delete already registered data sets in case of an exception

SVN: 16980
parent 03ff7663
No related branches found
No related tags found
No related merge requests found
...@@ -12,6 +12,8 @@ commandqueue-dir = ...@@ -12,6 +12,8 @@ commandqueue-dir =
# Port # Port
port = 8890 port = 8890
use-ssl = false
# Session timeout in minutes # Session timeout in minutes
session-timeout = 720 session-timeout = 720
...@@ -98,7 +100,7 @@ quiet-period = 10 ...@@ -98,7 +100,7 @@ quiet-period = 10
maintenance-plugins = data-set-clean-up maintenance-plugins = data-set-clean-up
data-set-clean-up.class = ch.systemsx.cisd.etlserver.plugins.DataSetDeletionMaintenanceTask data-set-clean-up.class = ch.systemsx.cisd.etlserver.plugins.DataSetDeletionMaintenanceTask
data-set-clean-up.interval = 30 data-set-clean-up.interval = 300
data-set-clean-up.data-source = data-source data-set-clean-up.data-source = data-source
post-registration-upload.class = eu.basysbio.cisd.dss.PostRegistrationDatabaseUploadTask post-registration-upload.class = eu.basysbio.cisd.dss.PostRegistrationDatabaseUploadTask
......
...@@ -27,6 +27,7 @@ import org.apache.log4j.Logger; ...@@ -27,6 +27,7 @@ import org.apache.log4j.Logger;
import ch.rinn.restrictions.Private; import ch.rinn.restrictions.Private;
import ch.systemsx.cisd.common.Constants; import ch.systemsx.cisd.common.Constants;
import ch.systemsx.cisd.common.exceptions.UserFailureException;
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;
...@@ -116,12 +117,13 @@ public class TimeSeriesAndTimePointDataSetHandler implements IDataSetHandler ...@@ -116,12 +117,13 @@ public class TimeSeriesAndTimePointDataSetHandler implements IDataSetHandler
count++; count++;
} }
void logAndSendOptinallyAnEMail(Logger logger, IMailClient mailClient, boolean sendEMail) void logSendEMailAndHandlerError(Logger logger, IMailClient mailClient, boolean sendEMail)
{ {
if (count < numberOfDerivedDataSets) if (count < numberOfDerivedDataSets)
{ {
operationLog.error("Only " + count + " " + type.name + " data sets instead of " int numberOfFailures = numberOfDerivedDataSets - count;
+ numberOfDerivedDataSets + " have been registered."); operationLog.error(numberOfFailures + " " + type.name
+ " data sets couldn't be registered.");
if (sendEMail) if (sendEMail)
{ {
String subject = String subject =
...@@ -130,14 +132,16 @@ public class TimeSeriesAndTimePointDataSetHandler implements IDataSetHandler ...@@ -130,14 +132,16 @@ public class TimeSeriesAndTimePointDataSetHandler implements IDataSetHandler
Constants.DATE_FORMAT.get().format( Constants.DATE_FORMAT.get().format(
new Date(timeProvider.getTimeInMilliseconds())); new Date(timeProvider.getTimeInMilliseconds()));
String message = String message =
"Uploading of data set '" + dataSetFileName + "' failed because only " "Uploading of data set '" + dataSetFileName + "' failed because "
+ count + " of " + numberOfDerivedDataSets + " " + type.name + numberOfFailures + " of " + numberOfDerivedDataSets + " "
+ " data sets could be registered in openBIS.\n\n" + type.name + " data sets couldn't be registered.\n\n"
+ "Please, contact the help desk for support: " + "Please, contact the help desk for support: "
+ HELPDESK_EMAIL + "\n(Time stamp of failure: " + timeStamp + HELPDESK_EMAIL + "\n(Time stamp of failure: " + timeStamp
+ ")"; + ")";
mailClient.sendMessage(subject, message, null, null, userEMail, HELPDESK_EMAIL); mailClient.sendMessage(subject, message, null, null, userEMail, HELPDESK_EMAIL);
} }
throw new UserFailureException("Not all data sets could be registered. "
+ "For more details see error messages in the log.");
} else } else
{ {
if (count > 0 && operationLog.isInfoEnabled()) if (count > 0 && operationLog.isInfoEnabled())
...@@ -181,10 +185,13 @@ public class TimeSeriesAndTimePointDataSetHandler implements IDataSetHandler ...@@ -181,10 +185,13 @@ public class TimeSeriesAndTimePointDataSetHandler implements IDataSetHandler
private final ITimeProvider timeProvider; private final ITimeProvider timeProvider;
private final IEncapsulatedOpenBISService service;
public TimeSeriesAndTimePointDataSetHandler(Properties parentProperties, public TimeSeriesAndTimePointDataSetHandler(Properties parentProperties,
IDataSetHandler delegator, IEncapsulatedOpenBISService openbisService) IDataSetHandler delegator, IEncapsulatedOpenBISService openbisService)
{ {
this.delegator = delegator; this.delegator = delegator;
this.service = openbisService;
this.mailClient = new MailClient(parentProperties); this.mailClient = new MailClient(parentProperties);
Properties specificProperties = Properties specificProperties =
ExtendedProperties.getSubset(parentProperties, ExtendedProperties.getSubset(parentProperties,
...@@ -198,11 +205,13 @@ public class TimeSeriesAndTimePointDataSetHandler implements IDataSetHandler ...@@ -198,11 +205,13 @@ public class TimeSeriesAndTimePointDataSetHandler implements IDataSetHandler
} }
@Private @Private
TimeSeriesAndTimePointDataSetHandler(IDataSetHandler delegator, IMailClient mailClient, TimeSeriesAndTimePointDataSetHandler(IDataSetHandler delegator,
IEncapsulatedOpenBISService openbisService, IMailClient mailClient,
IDataSetHandler timePointDataSetHandler, File timePointDataSetFolder, IDataSetHandler timePointDataSetHandler, File timePointDataSetFolder,
ITimeProvider timeProvider) ITimeProvider timeProvider)
{ {
this.delegator = delegator; this.delegator = delegator;
service = openbisService;
this.mailClient = mailClient; this.mailClient = mailClient;
this.timePointDataSetHandler = timePointDataSetHandler; this.timePointDataSetHandler = timePointDataSetHandler;
this.timePointDataSetFolder = timePointDataSetFolder; this.timePointDataSetFolder = timePointDataSetFolder;
...@@ -217,20 +226,36 @@ public class TimeSeriesAndTimePointDataSetHandler implements IDataSetHandler ...@@ -217,20 +226,36 @@ public class TimeSeriesAndTimePointDataSetHandler implements IDataSetHandler
boolean successful = result.isEmpty() == false; boolean successful = result.isEmpty() == false;
if (successful) if (successful)
{ {
DataSetInformation dataSetInformation = result.get(0); try
MessageBuilder builder = {
DataSetInformation dataSetInformation = result.get(0);
MessageBuilder builder =
new MessageBuilder(dataSetInformation.tryGetUploadingUserEmail(), timeProvider); new MessageBuilder(dataSetInformation.tryGetUploadingUserEmail(), timeProvider);
builder.setDataSetFileName(dataSet); builder.setDataSetFileName(dataSet);
File[] files = timePointDataSetFolder.listFiles(); File[] files = timePointDataSetFolder.listFiles();
handleDerivedDataSets(files, TypeOfDerivedDataSet.TIME_POINT, timePointDataSetHandler, handleDerivedDataSets(files, TypeOfDerivedDataSet.TIME_POINT, timePointDataSetHandler,
dataSetInfos, builder); dataSetInfos, builder);
files = dataSet.getParentFile().listFiles(LCA_MIC_TIME_SERIES_FILE_FILTER); files = dataSet.getParentFile().listFiles(LCA_MIC_TIME_SERIES_FILE_FILTER);
handleDerivedDataSets(files, TypeOfDerivedDataSet.LCA_MIC_TIME_SERIES, delegator, handleDerivedDataSets(files, TypeOfDerivedDataSet.LCA_MIC_TIME_SERIES, delegator,
dataSetInfos, builder); dataSetInfos, builder);
DataSetType dataSetType = dataSetInformation.getDataSetType(); DataSetType dataSetType = dataSetInformation.getDataSetType();
boolean lcaMicTimeSeries = boolean lcaMicTimeSeries =
dataSetType.getCode().equals(DataSetHandler.LCA_MIC_TIME_SERIES); dataSetType.getCode().equals(DataSetHandler.LCA_MIC_TIME_SERIES);
builder.logAndSendOptinallyAnEMail(operationLog, mailClient, lcaMicTimeSeries == false); builder.logSendEMailAndHandlerError(operationLog, mailClient, lcaMicTimeSeries == false);
} catch (RuntimeException ex)
{
// Data sets are deleted in reverse order because of possible parent-child relationships.
for (int i = dataSetInfos.size() - 1; i >= 0; i--)
{
String dataSetCode = dataSetInfos.get(i).getDataSetCode();
if (operationLog.isInfoEnabled())
{
operationLog.info("Delete data set " + dataSetCode);
}
service.deleteDataSet(dataSetCode, "Rollback registration");
}
throw ex;
}
} }
return dataSetInfos; return dataSetInfos;
} }
......
...@@ -29,17 +29,20 @@ import org.hamcrest.collection.IsArray; ...@@ -29,17 +29,20 @@ import org.hamcrest.collection.IsArray;
import org.hamcrest.core.IsNull; import org.hamcrest.core.IsNull;
import org.jmock.Expectations; import org.jmock.Expectations;
import org.jmock.Mockery; import org.jmock.Mockery;
import org.jmock.Sequence;
import org.testng.annotations.AfterMethod; import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod; import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import ch.rinn.restrictions.Friend; import ch.rinn.restrictions.Friend;
import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase; import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase;
import ch.systemsx.cisd.common.exceptions.UserFailureException;
import ch.systemsx.cisd.common.logging.LogInitializer; import ch.systemsx.cisd.common.logging.LogInitializer;
import ch.systemsx.cisd.common.mail.From; import ch.systemsx.cisd.common.mail.From;
import ch.systemsx.cisd.common.mail.IMailClient; import ch.systemsx.cisd.common.mail.IMailClient;
import ch.systemsx.cisd.common.utilities.ITimeProvider; import ch.systemsx.cisd.common.utilities.ITimeProvider;
import ch.systemsx.cisd.etlserver.IDataSetHandler; import ch.systemsx.cisd.etlserver.IDataSetHandler;
import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
...@@ -85,6 +88,8 @@ public class TimeSeriesAndTimePointDataSetHandlerTest extends AbstractFileSystem ...@@ -85,6 +88,8 @@ public class TimeSeriesAndTimePointDataSetHandlerTest extends AbstractFileSystem
private File dropBox; private File dropBox;
private File timePointFolder; private File timePointFolder;
private ITimeProvider timeProvider; private ITimeProvider timeProvider;
private IEncapsulatedOpenBISService service;
private Sequence sequence;
@BeforeMethod @BeforeMethod
public void beforeMethod() throws Exception public void beforeMethod() throws Exception
...@@ -92,7 +97,9 @@ public class TimeSeriesAndTimePointDataSetHandlerTest extends AbstractFileSystem ...@@ -92,7 +97,9 @@ public class TimeSeriesAndTimePointDataSetHandlerTest extends AbstractFileSystem
super.setUp(); super.setUp();
LogInitializer.init(); LogInitializer.init();
context = new Mockery(); context = new Mockery();
sequence = context.sequence("sequence");
delegator = context.mock(IDataSetHandler.class, "delegator"); delegator = context.mock(IDataSetHandler.class, "delegator");
service = context.mock(IEncapsulatedOpenBISService.class);
timePointDataSetHandler = context.mock(IDataSetHandler.class, "timePointDataSetHandler"); timePointDataSetHandler = context.mock(IDataSetHandler.class, "timePointDataSetHandler");
mailClient = context.mock(IMailClient.class); mailClient = context.mock(IMailClient.class);
timeProvider = context.mock(ITimeProvider.class); timeProvider = context.mock(ITimeProvider.class);
...@@ -100,7 +107,7 @@ public class TimeSeriesAndTimePointDataSetHandlerTest extends AbstractFileSystem ...@@ -100,7 +107,7 @@ public class TimeSeriesAndTimePointDataSetHandlerTest extends AbstractFileSystem
timePointFolder = new File(workingDirectory, "time-point-folder"); timePointFolder = new File(workingDirectory, "time-point-folder");
timePointFolder.mkdirs(); timePointFolder.mkdirs();
handler = handler =
new TimeSeriesAndTimePointDataSetHandler(delegator, mailClient, new TimeSeriesAndTimePointDataSetHandler(delegator, service, mailClient,
timePointDataSetHandler, timePointFolder, timeProvider); timePointDataSetHandler, timePointFolder, timeProvider);
} }
...@@ -177,13 +184,15 @@ public class TimeSeriesAndTimePointDataSetHandlerTest extends AbstractFileSystem ...@@ -177,13 +184,15 @@ public class TimeSeriesAndTimePointDataSetHandlerTest extends AbstractFileSystem
final File tp2 = new File(timePointFolder, "tp2"); final File tp2 = new File(timePointFolder, "tp2");
tp2.createNewFile(); tp2.createNewFile();
final DataSetInformation ds2 = new DataSetInformation(); final DataSetInformation ds2 = new DataSetInformation();
ds2.setDataSetCode("ds2");
final DataSetInformation dataSetInformation = new DataSetInformation(); final DataSetInformation dataSetInformation = new DataSetInformation();
dataSetInformation.setDataSetCode("ds1");
dataSetInformation.setUploadingUserEmail("john.doe@abc.de"); dataSetInformation.setUploadingUserEmail("john.doe@abc.de");
dataSetInformation.setDataSetType(new DataSetType(DataSetHandler.TIME_SERIES)); dataSetInformation.setDataSetType(new DataSetType(DataSetHandler.TIME_SERIES));
String expectedSubject = "BaSysBio: Failed uploading of data set 'drop-box'"; String expectedSubject = "BaSysBio: Failed uploading of data set 'drop-box'";
String expectedMessage = String expectedMessage =
"Uploading of data set 'drop-box' failed " "Uploading of data set 'drop-box' failed "
+ "because only 1 of 2 time point data sets could be registered in openBIS.\n\n" + "because 1 of 2 time point data sets couldn't be registered.\n\n"
+ "Please, contact the help desk for support: " + HELPDESK_EMAIL + "\n" + "Please, contact the help desk for support: " + HELPDESK_EMAIL + "\n"
+ "(Time stamp of failure: 1970-01-01 01:01:14 +0100)"; + "(Time stamp of failure: 1970-01-01 01:01:14 +0100)";
prepareSendingEMail(expectedSubject, expectedMessage, dataSetInformation, true); prepareSendingEMail(expectedSubject, expectedMessage, dataSetInformation, true);
...@@ -201,14 +210,24 @@ public class TimeSeriesAndTimePointDataSetHandlerTest extends AbstractFileSystem ...@@ -201,14 +210,24 @@ public class TimeSeriesAndTimePointDataSetHandlerTest extends AbstractFileSystem
one(timeProvider).getTimeInMilliseconds(); one(timeProvider).getTimeInMilliseconds();
will(returnValue(42 * 42 * 42L)); will(returnValue(42 * 42 * 42L));
one(service).deleteDataSet("ds2", "Rollback registration");
inSequence(sequence);
one(service).deleteDataSet("ds1", "Rollback registration");
inSequence(sequence);
} }
}); });
List<DataSetInformation> dataSets = handler.handleDataSet(dropBox); try
{
handler.handleDataSet(dropBox);
fail("UserFailureException expected");
} catch (UserFailureException ex)
{
assertEquals("Not all data sets could be registered. "
+ "For more details see error messages in the log.", ex.getMessage());
}
assertEquals(2, dataSets.size());
assertSame(dataSetInformation, dataSets.get(0));
assertSame(ds2, dataSets.get(1));
context.assertIsSatisfied(); context.assertIsSatisfied();
} }
...@@ -220,13 +239,15 @@ public class TimeSeriesAndTimePointDataSetHandlerTest extends AbstractFileSystem ...@@ -220,13 +239,15 @@ public class TimeSeriesAndTimePointDataSetHandlerTest extends AbstractFileSystem
final File tp2 = new File(workingDirectory, DataSetHandler.LCA_MIC_TIME_SERIES + "2"); final File tp2 = new File(workingDirectory, DataSetHandler.LCA_MIC_TIME_SERIES + "2");
tp2.createNewFile(); tp2.createNewFile();
final DataSetInformation ds2 = new DataSetInformation(); final DataSetInformation ds2 = new DataSetInformation();
ds2.setDataSetCode("ds2");
final DataSetInformation dataSetInformation = new DataSetInformation(); final DataSetInformation dataSetInformation = new DataSetInformation();
dataSetInformation.setDataSetCode("ds1");
dataSetInformation.setUploadingUserEmail("john.doe@abc.de"); dataSetInformation.setUploadingUserEmail("john.doe@abc.de");
dataSetInformation.setDataSetType(new DataSetType(DataSetHandler.LCA_MIC)); dataSetInformation.setDataSetType(new DataSetType(DataSetHandler.LCA_MIC));
String expectedSubject = "BaSysBio: Failed uploading of data set 'drop-box'"; String expectedSubject = "BaSysBio: Failed uploading of data set 'drop-box'";
String expectedMessage = String expectedMessage =
"Uploading of data set 'drop-box' failed " "Uploading of data set 'drop-box' failed "
+ "because only 1 of 2 LCA MIC time series data sets could be registered in openBIS.\n\n" + "because 1 of 2 LCA MIC time series data sets couldn't be registered.\n\n"
+ "Please, contact the help desk for support: " + HELPDESK_EMAIL + "\n" + "Please, contact the help desk for support: " + HELPDESK_EMAIL + "\n"
+ "(Time stamp of failure: 1970-01-01 01:01:14 +0100)"; + "(Time stamp of failure: 1970-01-01 01:01:14 +0100)";
prepareSendingEMail(expectedSubject, expectedMessage, dataSetInformation, true); prepareSendingEMail(expectedSubject, expectedMessage, dataSetInformation, true);
...@@ -244,14 +265,23 @@ public class TimeSeriesAndTimePointDataSetHandlerTest extends AbstractFileSystem ...@@ -244,14 +265,23 @@ public class TimeSeriesAndTimePointDataSetHandlerTest extends AbstractFileSystem
one(timeProvider).getTimeInMilliseconds(); one(timeProvider).getTimeInMilliseconds();
will(returnValue(42 * 42 * 42L)); will(returnValue(42 * 42 * 42L));
one(service).deleteDataSet("ds2", "Rollback registration");
inSequence(sequence);
one(service).deleteDataSet("ds1", "Rollback registration");
inSequence(sequence);
} }
}); });
List<DataSetInformation> dataSets = handler.handleDataSet(dropBox); try
{
assertEquals(2, dataSets.size()); handler.handleDataSet(dropBox);
assertSame(dataSetInformation, dataSets.get(0)); fail("UserFailureException expected");
assertSame(ds2, dataSets.get(1)); } catch (UserFailureException ex)
{
assertEquals("Not all data sets could be registered. "
+ "For more details see error messages in the log.", ex.getMessage());
}
context.assertIsSatisfied(); context.assertIsSatisfied();
} }
......
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