diff --git a/common/source/java/ch/systemsx/cisd/common/utilities/WaitingHelper.java b/common/source/java/ch/systemsx/cisd/common/utilities/WaitingHelper.java index 3cd3d3574df66165680ba3de593006e7ad7e582a..43461af69f1726809e523f2b55e555f01f89c12d 100644 --- a/common/source/java/ch/systemsx/cisd/common/utilities/WaitingHelper.java +++ b/common/source/java/ch/systemsx/cisd/common/utilities/WaitingHelper.java @@ -77,13 +77,24 @@ public class WaitingHelper */ public boolean waitOn(IWaitingCondition condition) { - long t0 = provider.getTimeInMilliseconds(); - long t = t0; - long lastLogTime = t0; + return waitOn(provider.getTimeInMilliseconds(), condition); + } + + /** + * Waits until specified condition is fulfilled. + * + * @param startTime Start time. Waiting times out after startTime + timeOut. + * * @return <code>true</code> if waiting stops because condition has been fulfilled. + * If this isn't the case after the specified time out <code>false</code> will be returned. + */ + public boolean waitOn(long startTime, IWaitingCondition condition) + { + long t = startTime; + long lastLogTime = startTime; long logInterval = MINIMUM_LOG_INTERVAL; - while (t < t0 + timeOut) + while (t < startTime + timeOut) { - long duration = t - t0; + long duration = t - startTime; String renderedDuration = DateTimeUtils.renderDuration(duration); if (condition.conditionFulfilled()) { diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchiver.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchiver.java index 06bf82611d4abd061b9e6444043ab9ec41cf5b98..72681b9e0887a661a5795c1fbce9fe849257d103 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchiver.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchiver.java @@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.archiver; import java.io.File; import java.io.Serializable; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; @@ -347,7 +348,8 @@ public class MultiDataSetArchiver extends AbstractArchiverProcessingPlugin { return; } - MultiDataSetArchivingFinalizer task = new MultiDataSetArchivingFinalizer(cleanerProperties, SystemTimeProvider.SYSTEM_TIME_PROVIDER); + ITimeAndWaitingProvider timeProvider = SystemTimeProvider.SYSTEM_TIME_PROVIDER; + MultiDataSetArchivingFinalizer task = new MultiDataSetArchivingFinalizer(cleanerProperties, timeProvider); String userId = archiverContext.getUserId(); String userEmail = archiverContext.getUserEmail(); String userSessionToken = archiverContext.getUserSessionToken(); @@ -358,6 +360,8 @@ public class MultiDataSetArchiver extends AbstractArchiverProcessingPlugin parameterBindings.put(MultiDataSetArchivingFinalizer.REPLICATED_FILE_PATH_KEY, operations.getReplicatedArchiveFilePath(containerPath)); parameterBindings.put(MultiDataSetArchivingFinalizer.FINALIZER_POLLING_TIME_KEY, Long.toString(finalizerPollingTime)); + SimpleDateFormat dateFormat = new SimpleDateFormat(MultiDataSetArchivingFinalizer.TIME_STAMP_FORMAT); + parameterBindings.put(MultiDataSetArchivingFinalizer.START_TIME_KEY, dateFormat.format(timeProvider.getTimeInMilliseconds())); parameterBindings.put(MultiDataSetArchivingFinalizer.FINALIZER_MAX_WAITING_TIME_KEY, Long.toString(finalizerMaxWaitingTime)); DataSetArchivingStatus status = removeFromDataStore ? DataSetArchivingStatus.ARCHIVED : DataSetArchivingStatus.AVAILABLE; parameterBindings.put(MultiDataSetArchivingFinalizer.STATUS_KEY, status.toString()); 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 cca312c5166637926fbc19b0bf5cd1366b666a03..af4e02f586daf49ba35105d3c9e15e0be8f4b7c7 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 @@ -17,6 +17,8 @@ package ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.archiver; import java.io.File; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -60,8 +62,11 @@ class MultiDataSetArchivingFinalizer implements IProcessingPluginTask public static final String REPLICATED_FILE_PATH_KEY = "replicated-file-path"; public static final String FINALIZER_POLLING_TIME_KEY = "finalizer-polling-time"; public static final String FINALIZER_MAX_WAITING_TIME_KEY = "finalizer-max-waiting-time"; + public static final String START_TIME_KEY = "start-time"; public static final String STATUS_KEY = "status"; + public static final String TIME_STAMP_FORMAT = "yyyy-MM-dd HH:mm:ss"; + private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, MultiDataSetArchivingFinalizer.class); @@ -165,7 +170,8 @@ class MultiDataSetArchivingFinalizer implements IProcessingPluginTask long waitingTime = parameters.getWaitingTime(); Log4jSimpleLogger logger = new Log4jSimpleLogger(operationLog); WaitingHelper waitingHelper = new WaitingHelper(waitingTime, parameters.getPollingTime(), timeProvider, logger); - return waitingHelper.waitOn(new IWaitingCondition() + long startTime = parameters.getStartTime(); + return waitingHelper.waitOn(startTime, new IWaitingCondition() { @Override public boolean conditionFulfilled() @@ -201,11 +207,25 @@ class MultiDataSetArchivingFinalizer implements IProcessingPluginTask parameters.setOriginalFile(new File(getProperty(parameterBindings, ORIGINAL_FILE_PATH_KEY))); parameters.setReplicatedFile(new File(getProperty(parameterBindings, REPLICATED_FILE_PATH_KEY))); parameters.setPollingTime(getNumber(parameterBindings, FINALIZER_POLLING_TIME_KEY)); + parameters.setStartTime(getTimestamp(parameterBindings, START_TIME_KEY)); parameters.setWaitingTime(getNumber(parameterBindings, FINALIZER_MAX_WAITING_TIME_KEY)); parameters.setStatus(DataSetArchivingStatus.valueOf(getProperty(parameterBindings, STATUS_KEY))); return parameters; } + private long getTimestamp(Map<String, String> parameterBindings, String property) + { + String value = getProperty(parameterBindings, property); + try + { + return new SimpleDateFormat(TIME_STAMP_FORMAT).parse(value).getTime(); + } catch (ParseException ex) + { + throw new IllegalArgumentException("Property '" + property + "' isn't a time stamp of format " + + TIME_STAMP_FORMAT + ": " + value); + } + } + private long getNumber(Map<String, String> parameterBindings, String property) { String value = getProperty(parameterBindings, property); @@ -234,6 +254,7 @@ class MultiDataSetArchivingFinalizer implements IProcessingPluginTask private File originalFile; private File replicatedFile; private long pollingTime; + private long startTime; private long waitingTime; private DataSetArchivingStatus status; @@ -257,6 +278,16 @@ class MultiDataSetArchivingFinalizer implements IProcessingPluginTask return pollingTime; } + public long getStartTime() + { + return startTime; + } + + public void setStartTime(long startTime) + { + this.startTime = startTime; + } + public void setWaitingTime(long waitingTime) { this.waitingTime = waitingTime; 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 872d806719ff7f90c938d3f76bb6dda28b18b9f2..697bf4ac842b1b14329d2dbf16717fd7355f0dd6 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 @@ -17,6 +17,7 @@ package ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.archiver; import java.io.File; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedHashMap; @@ -55,6 +56,12 @@ import ch.systemsx.cisd.openbis.util.LogRecordingUtils; */ public class MultiDataSetArchivingFinalizerTest extends AbstractFileSystemTestCase { + + private static final long START_TIME = 123456789012l; + + private static final String START_TIME_AS_STRING + = new SimpleDateFormat(MultiDataSetArchivingFinalizer.TIME_STAMP_FORMAT).format(START_TIME); + private static final String USER_ID = "test-user"; private static final String USER_EMAIL = "a@bc.de"; @@ -112,13 +119,14 @@ public class MultiDataSetArchivingFinalizerTest extends AbstractFileSystemTestCa parameterBindings.put(MultiDataSetArchivingFinalizer.ORIGINAL_FILE_PATH_KEY, dataFileInArchive.getPath()); parameterBindings.put(MultiDataSetArchivingFinalizer.REPLICATED_FILE_PATH_KEY, dataFileReplicated.getPath()); parameterBindings.put(MultiDataSetArchivingFinalizer.FINALIZER_POLLING_TIME_KEY, "20000"); + parameterBindings.put(MultiDataSetArchivingFinalizer.START_TIME_KEY, START_TIME_AS_STRING); parameterBindings.put(MultiDataSetArchivingFinalizer.FINALIZER_MAX_WAITING_TIME_KEY, "300000"); parameterBindings.put(MultiDataSetArchivingFinalizer.STATUS_KEY, DataSetArchivingStatus.ARCHIVED.toString()); processingContext = new DataSetProcessingContext(null, null, parameterBindings, null, USER_ID, USER_EMAIL); updatedStatus = new ArrayList<DataSetCodesWithStatus>(); cleaner = new MockCleaner(); - finalizer = new MultiDataSetArchivingFinalizer(null, new MockTimeProvider()) + finalizer = new MultiDataSetArchivingFinalizer(null, new MockTimeProvider(START_TIME, 1000)) { private static final long serialVersionUID = 1L; @@ -175,7 +183,8 @@ public class MultiDataSetArchivingFinalizerTest extends AbstractFileSystemTestCa assertEquals("INFO OPERATION.MultiDataSetArchivingFinalizer - " + "Parameters: {original-file-path=" + dataFileInArchive.getPath() + ", replicated-file-path=" + dataFileReplicated.getPath() + ", " - + "finalizer-polling-time=20000, finalizer-max-waiting-time=300000, status=ARCHIVED}\n" + + "finalizer-polling-time=20000, start-time=" + START_TIME_AS_STRING + ", " + + "finalizer-max-waiting-time=300000, status=ARCHIVED}\n" + "INFO OPERATION.MultiDataSetArchivingFinalizer - Waiting for replication of archive " + "'" + dataFileInArchive.getPath() + "' containing the following data sets: [ds1]\n" + "INFO OPERATION.MultiDataSetArchivingFinalizer - Condition fulfilled after < 1sec, condition: " @@ -199,7 +208,8 @@ public class MultiDataSetArchivingFinalizerTest extends AbstractFileSystemTestCa assertEquals("INFO OPERATION.MultiDataSetArchivingFinalizer - " + "Parameters: {original-file-path=" + dataFileInArchive.getPath() + ", replicated-file-path=" + dataFileReplicated.getPath() + ", " - + "finalizer-polling-time=20000, finalizer-max-waiting-time=300000, status=AVAILABLE}\n" + + "finalizer-polling-time=20000, start-time=" + START_TIME_AS_STRING + ", " + + "finalizer-max-waiting-time=300000, status=AVAILABLE}\n" + "INFO OPERATION.MultiDataSetArchivingFinalizer - Waiting for replication of archive " + "'" + dataFileInArchive.getPath() + "' containing the following data sets: [ds1]\n" + "INFO OPERATION.MultiDataSetArchivingFinalizer - Condition fulfilled after < 1sec, condition: " @@ -233,7 +243,8 @@ public class MultiDataSetArchivingFinalizerTest extends AbstractFileSystemTestCa assertEquals("INFO OPERATION.MultiDataSetArchivingFinalizer - " + "Parameters: {original-file-path=" + dataFileInArchive.getPath() + ", replicated-file-path=" + dataFilePartiallyReplicated.getPath() + ", " - + "finalizer-polling-time=20000, finalizer-max-waiting-time=300000, status=ARCHIVED}\n" + + "finalizer-polling-time=20000, start-time=" + START_TIME_AS_STRING + ", " + + "finalizer-max-waiting-time=300000, status=ARCHIVED}\n" + "INFO OPERATION.MultiDataSetArchivingFinalizer - Waiting for replication of archive " + "'" + dataFileInArchive.getPath() + "' containing the following data sets: [ds1, ds2]\n" + "INFO OPERATION.MultiDataSetArchivingFinalizer - Condition still not fulfilled after < 1sec, " @@ -276,7 +287,8 @@ public class MultiDataSetArchivingFinalizerTest extends AbstractFileSystemTestCa assertEquals("INFO OPERATION.MultiDataSetArchivingFinalizer - " + "Parameters: {original-file-path=" + dataFileInArchive.getPath() + ", replicated-file-path=" + dataFilePartiallyReplicated.getPath() + ", " - + "finalizer-polling-time=20000, finalizer-max-waiting-time=300000, status=AVAILABLE}\n" + + "finalizer-polling-time=20000, start-time=" + START_TIME_AS_STRING + ", " + + "finalizer-max-waiting-time=300000, status=AVAILABLE}\n" + "INFO OPERATION.MultiDataSetArchivingFinalizer - Waiting for replication of archive " + "'" + dataFileInArchive.getPath() + "' containing the following data sets: [ds1, ds2]\n" + "INFO OPERATION.MultiDataSetArchivingFinalizer - Condition still not fulfilled after < 1sec, "