From f90799f573dddf50d727f1f8a2049412b9e326a0 Mon Sep 17 00:00:00 2001 From: gakin <gakin> Date: Thu, 9 Jul 2015 13:09:04 +0000 Subject: [PATCH] SSDM-2054 : Multi Data Set Archiving Finalizer improvements - Handle the case when the original archive file no longer exists. SVN: 34340 --- .../MultiDataSetArchivingFinalizer.java | 57 ++++++++++++------- .../MultiDataSetArchivingFinalizerTest.java | 35 ++++++++++++ 2 files changed, 70 insertions(+), 22 deletions(-) diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchivingFinalizer.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchivingFinalizer.java index 1588712aff7..f49b839582b 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchivingFinalizer.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchivingFinalizer.java @@ -98,33 +98,34 @@ class MultiDataSetArchivingFinalizer implements IProcessingPluginTask try { Parameters parameters = getParameters(context); - File originalFile = parameters.getOriginalFile(); - operationLog.info("Waiting for replication of archive '" + originalFile - + "' containing the following data sets: " + CollectionUtils.abbreviate(dataSetCodes, 20)); - boolean noTimeout = waitUntilReplicated(parameters); DataSetArchivingStatus archivingStatus = parameters.getStatus(); boolean removeFromDataStore = archivingStatus.isAvailable() == false; - if (noTimeout) + File originalFile = parameters.getOriginalFile(); + if (originalFile.exists() == false) { - DataSetCodesWithStatus codesWithStatus = new DataSetCodesWithStatus(dataSetCodes, archivingStatus, true); - IDataSetDeleter dataSetDeleter = ServiceProvider.getDataStoreService().getDataSetDeleter(); - if (removeFromDataStore) - { - dataSetDeleter.scheduleDeletionOfDataSets(datasets, - TimingParameters.DEFAULT_MAXIMUM_RETRY_COUNT, - TimingParameters.DEFAULT_INTERVAL_TO_WAIT_AFTER_FAILURE_SECONDS); - } - updateStatus(codesWithStatus); + String message = "Replication of '" + originalFile + "' failed because the original file does not exist."; + status = createStatusAndRearchive(dataSetCodes, parameters, removeFromDataStore, originalFile, message); } else { - String message = "Replication of '" + originalFile + "' failed."; - operationLog.error(message); - status = Status.createError(message); - getCleaner().delete(originalFile); - getCleaner().delete(parameters.getReplicatedFile()); - removeFromMapping(originalFile); - updateStatus(new DataSetCodesWithStatus(dataSetCodes, DataSetArchivingStatus.AVAILABLE, false)); - ServiceProvider.getOpenBISService().archiveDataSets(dataSetCodes, removeFromDataStore); + operationLog.info("Waiting for replication of archive '" + originalFile + + "' containing the following data sets: " + CollectionUtils.abbreviate(dataSetCodes, 20)); + boolean noTimeout = waitUntilReplicated(parameters); + if (noTimeout) + { + DataSetCodesWithStatus codesWithStatus = new DataSetCodesWithStatus(dataSetCodes, archivingStatus, true); + IDataSetDeleter dataSetDeleter = ServiceProvider.getDataStoreService().getDataSetDeleter(); + if (removeFromDataStore) + { + dataSetDeleter.scheduleDeletionOfDataSets(datasets, + TimingParameters.DEFAULT_MAXIMUM_RETRY_COUNT, + TimingParameters.DEFAULT_INTERVAL_TO_WAIT_AFTER_FAILURE_SECONDS); + } + updateStatus(codesWithStatus); + } else + { + String message = "Replication of '" + originalFile + "' failed."; + status = createStatusAndRearchive(dataSetCodes, parameters, removeFromDataStore, originalFile, message); + } } } catch (Exception ex) { @@ -136,6 +137,18 @@ class MultiDataSetArchivingFinalizer implements IProcessingPluginTask return processingStatus; } + private Status createStatusAndRearchive(List<String> dataSetCodes, Parameters parameters, boolean removeFromDataStore, File originalFile, String message) + { + operationLog.error(message); + Status status = Status.createError(message); + getCleaner().delete(originalFile); + getCleaner().delete(parameters.getReplicatedFile()); + removeFromMapping(originalFile); + updateStatus(new DataSetCodesWithStatus(dataSetCodes, DataSetArchivingStatus.AVAILABLE, false)); + ServiceProvider.getOpenBISService().archiveDataSets(dataSetCodes, removeFromDataStore); + return status; + } + private void removeFromMapping(File originalFile) { IMultiDataSetArchiverDBTransaction transaction = getTransaction(); diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchivingFinalizerTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchivingFinalizerTest.java index 922b4c5295e..3df4f4b7db1 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchivingFinalizerTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchivingFinalizerTest.java @@ -156,6 +156,41 @@ public class MultiDataSetArchivingFinalizerTest extends AbstractFileSystemTestCa context.assertIsSatisfied(); } + @Test + public void testReplicationFailDueToMissingArchiveFile() + { + final DatasetDescription ds1 = new DatasetDescriptionBuilder("ds1").getDatasetDescription(); + + dataFileInArchive.delete(); + + context.checking(new Expectations() + { + { + one(transaction).deleteContainer(dataFileInArchive.getName()); + one(transaction).commit(); + one(transaction).close(); + one(openBISService).archiveDataSets(Arrays.asList(ds1.getDataSetCode()), true); + } + }); + + ProcessingStatus status = createFinalizer().process(Arrays.asList(ds1), processingContext); + + assertEquals("INFO OPERATION.MultiDataSetArchivingFinalizer - " + + "Parameters: {original-file-path=" + dataFileInArchive.getPath() + + ", replicated-file-path=" + dataFileReplicated.getPath() + ", " + + "finalizer-polling-time=20000, start-time=" + START_TIME_AS_STRING + ", " + + "finalizer-max-waiting-time=300000, status=ARCHIVED}\n" + + "ERROR OPERATION.MultiDataSetArchivingFinalizer - Replication of " + + "'" + dataFileInArchive.getPath() + "' failed because the original file does not exist.", + logRecorder.getLogContent()); + assertEquals("ERROR: \"Replication of '" + dataFileInArchive.getPath() + "' failed because the original file does not exist.\"", + status.tryGetStatusByDataset(ds1.getDataSetCode()).toString()); + assertEquals("[[ds1] - AVAILABLE]", updatedStatus.toString()); + assertEquals(false, updatedStatus.get(0).isPresentInArchive()); + assertEquals(Arrays.asList(dataFileInArchive, dataFileReplicated).toString(), cleaner.toString()); + context.assertIsSatisfied(); + } + @Test public void testReplicationForArchiving() { -- GitLab