From 6b34d5e843fba0b5db386903e96cafc2c650dbf9 Mon Sep 17 00:00:00 2001 From: jakubs <jakubs> Date: Fri, 24 Jul 2015 07:19:25 +0000 Subject: [PATCH] SSDM-2230 implement waiting period for data sets to confirm storage before processing them SVN: 34368 --- .../path/PathInfoDatabaseFeedingTask.java | 60 ++++++++++++++++++- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/PathInfoDatabaseFeedingTask.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/PathInfoDatabaseFeedingTask.java index 43ed9c3913f..5e8857382b7 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/PathInfoDatabaseFeedingTask.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/PathInfoDatabaseFeedingTask.java @@ -17,6 +17,7 @@ package ch.systemsx.cisd.etlserver.path; import java.io.File; +import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Properties; @@ -172,7 +173,9 @@ public class PathInfoDatabaseFeedingTask implements IMaintenanceTask, IPostRegis { return PropertyUtils.getBoolean(properties, COMPUTE_CHECKSUM_KEY, false); } - + + private static final int waitingPeriodForStorageConfirmationInSeconds = 3600; + @Override public void execute() { @@ -204,8 +207,61 @@ public class PathInfoDatabaseFeedingTask implements IMaintenanceTask, IPostRegis } while (dataSets.size() >= chunkSize && stopCondition.fulfilled() == false); operationLog.info("Feeding finished."); } - + private List<SimpleDataSetInformationDTO> getNextChunk() + { + long start = System.currentTimeMillis(); + // we will wait periods of time defined by exponential sequence with 1.5 exponent up to 1h + float waitingTime = 1000; + while (System.currentTimeMillis() - start < waitingPeriodForStorageConfirmationInSeconds * 1000) + { + List<SimpleDataSetInformationDTO> dataSets = listDataSets(); + SimpleDataSetInformationDTO nonConfirmedData = findFirstNonConfirmedDataSet(dataSets); + if (nonConfirmedData == null) + { + return dataSets; + } + + long waitingTimeInMiliseconds = (long) waitingTime; + operationLog.info("One of the data sets selected for path-info feeding doesn't yet have storage confirmed " + + nonConfirmedData.getDataSetCode() + ". Will wait for " + + (waitingTimeInMiliseconds / 1000) + " seconds"); + try + { + Thread.sleep(waitingTimeInMiliseconds); + } catch (InterruptedException ex) + { + } + waitingTime *= 1.5; + } + List<SimpleDataSetInformationDTO> dataSets = listDataSets(); + List<SimpleDataSetInformationDTO> result = new ArrayList<SimpleDataSetInformationDTO>(); + for (SimpleDataSetInformationDTO dataSet : dataSets) + { + if (dataSet.isStorageConfirmed()) + { + result.add(dataSet); + } else + { + operationLog.error("Gave up on feeding path-info db for data set " + dataSet.getDataSetCode() + ""); + } + } + return result; + } + + private SimpleDataSetInformationDTO findFirstNonConfirmedDataSet(List<SimpleDataSetInformationDTO> dataSets) + { + for (SimpleDataSetInformationDTO dataSet : dataSets) + { + if (dataSet.isStorageConfirmed() == false) + { + return dataSet; + } + } + return null; + } + + private List<SimpleDataSetInformationDTO> listDataSets() { Date timestamp = dao.getRegistrationTimestampOfLastFeedingEvent(); if (timestamp == null) -- GitLab