From 6814a12f7813d52815f5ad3aac46b133d58b8b31 Mon Sep 17 00:00:00 2001 From: jakubs <jakubs> Date: Mon, 22 Sep 2014 11:30:25 +0000 Subject: [PATCH] SSDM-891 Store archiving status of datasets on the fly - without waiting for the full operation to complete on all datasets SVN: 32468 --- .../AbstractArchiverProcessingPlugin.java | 74 ++++++++++++++++++- .../dss/generic/shared/ProcessingStatus.java | 9 ++- 2 files changed, 80 insertions(+), 3 deletions(-) diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/AbstractArchiverProcessingPlugin.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/AbstractArchiverProcessingPlugin.java index 477c889b91c..14ffe4d38e6 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/AbstractArchiverProcessingPlugin.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/AbstractArchiverProcessingPlugin.java @@ -22,6 +22,7 @@ import static ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetArchiving import java.io.File; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Properties; @@ -140,14 +141,29 @@ public abstract class AbstractArchiverProcessingPlugin extends AbstractDatastore operationLog.info("Archiving of the following datasets has been requested: " + CollectionUtils.abbreviate(datasets, 10)); - DatasetProcessingStatuses statuses = safeArchive(datasets, context, removeFromDataStore); + DatasetProcessingStatuses finalstatuses = new DatasetProcessingStatuses(); + + for (DatasetDescription singleDatset : datasets) + { + List<DatasetDescription> singleBatch = Collections.singletonList(singleDatset); + + archiveSingleBatch(context, removeFromDataStore, finalstatuses, singleBatch); + } + + return finalstatuses.getProcessingStatus(); + } + + private void archiveSingleBatch(final ArchiverTaskContext context, boolean removeFromDataStore, DatasetProcessingStatuses finalstatuses, + List<DatasetDescription> singleBatch) + { + DatasetProcessingStatuses statuses = safeArchive(singleBatch, context, removeFromDataStore); DataSetArchivingStatus successStatus = (removeFromDataStore) ? ARCHIVED : AVAILABLE; asyncUpdateStatuses(statuses.getSuccessfulDatasetCodes(), successStatus, true); asyncUpdateStatuses(statuses.getFailedDatasetCodes(), AVAILABLE, false); - return statuses.getProcessingStatus(); + finalstatuses.addResults(statuses); } private void initializeDatasetSizesIfNeeded(List<DatasetDescription> datasets) @@ -392,6 +408,25 @@ public abstract class AbstractArchiverProcessingPlugin extends AbstractDatastore this.processingStatus = new ProcessingStatus(); } + public void addResults(DatasetProcessingStatuses otherStatuses) + { + ProcessingStatus otherProcessingStatus = otherStatuses.getProcessingStatus(); + + for (String datasetCode : otherProcessingStatus.getDatasetsByStatus(Status.OK)) + { + addResultQuietly(datasetCode, Status.OK); + } + + for (Status error : otherProcessingStatus.getErrorStatuses()) + { + for (String datasetCode : otherProcessingStatus.getDatasetsByStatus(error)) + { + addResultQuietly(datasetCode, error); + } + } + + } + public void addResult(Collection<DatasetDescription> datasets, Status status, Operation operation) { @@ -421,6 +456,18 @@ public abstract class AbstractArchiverProcessingPlugin extends AbstractDatastore processingStatus.addDatasetStatus(datasetCode, status); } + private void addResultQuietly(String datasetCode, Status status) + { + if (status.isError()) + { + failedDatasetCodes.add(datasetCode); + } else + { + successfulDatasetCodes.add(datasetCode); + } + processingStatus.addDatasetStatus(datasetCode, status); + } + private String createLogMessage(String datasetCode, Status status, String operation) { return String.format("%s for dataset %s finished with the status: %s.", operation, @@ -443,6 +490,29 @@ public abstract class AbstractArchiverProcessingPlugin extends AbstractDatastore } } + protected final static DatasetProcessingStatuses createStatuesFailIfAnyFailed(DatasetProcessingStatuses statuses) + { + if (statuses.getFailedDatasetCodes().isEmpty()) + return statuses; + DatasetProcessingStatuses result = new DatasetProcessingStatuses(); + + ProcessingStatus otherProcessingStatus = statuses.getProcessingStatus(); + + for (Status error : otherProcessingStatus.getErrorStatuses()) + { + for (String datasetCode : otherProcessingStatus.getDatasetsByStatus(error)) + { + result.addResultQuietly(datasetCode, error); + } + } + + for (String datasetCode : otherProcessingStatus.getDatasetsByStatus(Status.OK)) + { + result.addResultQuietly(datasetCode, Status.createError("Successful, but part of a failed batch.")); + } + return result; + } + protected final static DatasetProcessingStatuses createStatuses(Status status, List<DatasetDescription> datasets, Operation operation) { diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/ProcessingStatus.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/ProcessingStatus.java index cd55267f5e7..241c5eab7ae 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/ProcessingStatus.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/ProcessingStatus.java @@ -17,6 +17,7 @@ package ch.systemsx.cisd.openbis.dss.generic.shared; import java.util.ArrayList; +import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -56,7 +57,13 @@ public class ProcessingStatus public List<String/* dataset code */> getDatasetsByStatus(Status status) { - return datasetByStatus.get(status); + if (datasetByStatus.containsKey(status)) + { + return datasetByStatus.get(status); + } else + { + return Collections.emptyList(); + } } public void addDatasetStatus(DatasetDescription dataset, Status status) -- GitLab