diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/FillUnknownDataSetSizeInOpenbisDBFromPathInfoDBMaintenanceTask.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/FillUnknownDataSetSizeInOpenbisDBFromPathInfoDBMaintenanceTask.java index 1b5abd2317dc7d485a5eeb797d0b64df5932a2e9..5289a865bf3d39c0a7f764709c3382171d16b79a 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/FillUnknownDataSetSizeInOpenbisDBFromPathInfoDBMaintenanceTask.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/FillUnknownDataSetSizeInOpenbisDBFromPathInfoDBMaintenanceTask.java @@ -30,6 +30,10 @@ import org.apache.log4j.Logger; import ch.systemsx.cisd.common.logging.LogCategory; import ch.systemsx.cisd.common.logging.LogFactory; import ch.systemsx.cisd.common.maintenance.IMaintenanceTask; +import ch.systemsx.cisd.common.properties.PropertyUtils; +import ch.systemsx.cisd.common.time.DateTimeUtils; +import ch.systemsx.cisd.common.utilities.ITimeProvider; +import ch.systemsx.cisd.common.utilities.SystemTimeProvider; import ch.systemsx.cisd.etlserver.path.IPathsInfoDAO; import ch.systemsx.cisd.etlserver.path.PathEntryDTO; import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; @@ -46,64 +50,103 @@ public class FillUnknownDataSetSizeInOpenbisDBFromPathInfoDBMaintenanceTask impl private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, FillUnknownDataSetSizeInOpenbisDBFromPathInfoDBMaintenanceTask.class); + static final String CHUNK_SIZE_KEY = "data-set-chunk-size"; + + static final String TIME_LIMIT_KEY = "time-limit"; + + static final int DEFAULT_CHUNK_SIZE = 100; + + static final int DEFAULT_TIME_LIMIT = 1000 * 60 * 60; + private IEncapsulatedOpenBISService service; private IPathsInfoDAO dao; + private ITimeProvider timeProvider; + + private int chunkSize; + + private long timeLimit; + public FillUnknownDataSetSizeInOpenbisDBFromPathInfoDBMaintenanceTask() { + service = ServiceProvider.getOpenBISService(); + dao = createDAO(); + timeProvider = SystemTimeProvider.SYSTEM_TIME_PROVIDER; } - public FillUnknownDataSetSizeInOpenbisDBFromPathInfoDBMaintenanceTask(IEncapsulatedOpenBISService service, IPathsInfoDAO dao) + public FillUnknownDataSetSizeInOpenbisDBFromPathInfoDBMaintenanceTask(IEncapsulatedOpenBISService service, IPathsInfoDAO dao, + ITimeProvider timeProvider) { this.service = service; this.dao = dao; + this.timeProvider = timeProvider; } @Override public void setUp(String pluginName, Properties properties) { - service = ServiceProvider.getOpenBISService(); - dao = createDAO(); + chunkSize = PropertyUtils.getInt(properties, CHUNK_SIZE_KEY, DEFAULT_CHUNK_SIZE); + timeLimit = DateTimeUtils.getDurationInMillis(properties, TIME_LIMIT_KEY, DEFAULT_TIME_LIMIT); + operationLog.info(pluginName + " initialized with chunk size = " + chunkSize + ", time limit = " + DateTimeUtils.renderDuration(timeLimit)); } + @SuppressWarnings("null") @Override public void execute() { operationLog.info("Start filling."); - List<SimpleDataSetInformationDTO> dataSets = service.listPhysicalDataSetsWithUnknownSize(); + List<SimpleDataSetInformationDTO> dataSets = null; - operationLog.info("Found " + (dataSets != null ? dataSets.size() : 0) + " dataset(s) with unknown size in openbis database."); + long startTime = timeProvider.getTimeInMilliseconds(); + boolean foundDataSets = false; + boolean reachedTimeLimit = false; + int chunkIndex = 1; - if (dataSets != null && false == dataSets.isEmpty()) + do { - Set<String> codes = new HashSet<String>(); + dataSets = service.listPhysicalDataSetsWithUnknownSize(chunkSize); + foundDataSets = dataSets != null && false == dataSets.isEmpty(); - for (SimpleDataSetInformationDTO dataSet : dataSets) + if (foundDataSets) { - codes.add(dataSet.getDataSetCode()); - } + operationLog.info("Found " + dataSets.size() + " dataset(s) with unknown size in openbis database (chunk: " + chunkIndex + ")."); - List<PathEntryDTO> pathInfoEntries = dao.listDataSetsSize(codes.toArray(new String[codes.size()])); + Set<String> codes = new HashSet<String>(); - if (pathInfoEntries != null && false == pathInfoEntries.isEmpty()) - { - Map<String, Long> sizeMap = new HashMap<String, Long>(); + for (SimpleDataSetInformationDTO dataSet : dataSets) + { + codes.add(dataSet.getDataSetCode()); + } + + List<PathEntryDTO> pathInfoEntries = dao.listDataSetsSize(codes.toArray(new String[codes.size()])); - for (PathEntryDTO pathInfoEntry : pathInfoEntries) + if (pathInfoEntries != null && false == pathInfoEntries.isEmpty()) { - if (pathInfoEntry.getSizeInBytes() != null) + Map<String, Long> sizeMap = new HashMap<String, Long>(); + + for (PathEntryDTO pathInfoEntry : pathInfoEntries) { - sizeMap.put(pathInfoEntry.getDataSetCode(), pathInfoEntry.getSizeInBytes()); + if (pathInfoEntry.getSizeInBytes() != null) + { + sizeMap.put(pathInfoEntry.getDataSetCode(), pathInfoEntry.getSizeInBytes()); + } } - } - operationLog.info("Found sizes for " + sizeMap.size() + " dataset(s) in pathinfo database."); + operationLog.info("Found sizes for " + sizeMap.size() + " dataset(s) in pathinfo database (chunk: " + chunkIndex + ")."); - service.updatePhysicalDataSetsSize(sizeMap); + service.updatePhysicalDataSetsSize(sizeMap); + } + } else + { + operationLog.info("Did not find any datasets with unknown size in openbis database (chunk: " + chunkIndex + ")."); } - } + + reachedTimeLimit = timeProvider.getTimeInMilliseconds() > startTime + timeLimit; + chunkIndex++; + + } while (foundDataSets && false == reachedTimeLimit); operationLog.info("Filling finished."); } diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISService.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISService.java index 17353cce39b0a36a47b90f46a3ad38e42d839558..6130696f4f5925f115c7efbf5f35b2eca99fadcb 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISService.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISService.java @@ -665,11 +665,11 @@ public final class EncapsulatedOpenBISService implements IEncapsulatedOpenBISSer } @Override - public List<SimpleDataSetInformationDTO> listPhysicalDataSetsWithUnknownSize() throws UserFailureException + public List<SimpleDataSetInformationDTO> listPhysicalDataSetsWithUnknownSize(int chunkSize) throws UserFailureException { List<SimpleDataSetInformationDTO> dataSets = service.listPhysicalDataSetsWithUnknownSize(session.getSessionToken(), - session.getDataStoreCode()); + session.getDataStoreCode(), chunkSize); return injectDefaultShareIdIfMissing(dataSets); } diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IEncapsulatedOpenBISService.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IEncapsulatedOpenBISService.java index db800139a673648dbc3bc15dc28eccc40c4468c2..cae0efa585a8dc1991ef103b92d7516286268da9 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IEncapsulatedOpenBISService.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IEncapsulatedOpenBISService.java @@ -284,7 +284,7 @@ public interface IEncapsulatedOpenBISService extends IEncapsulatedBasicOpenBISSe * Returns informations about physical data sets with unknown size that belong to the calling data store server. */ @ManagedAuthentication - public List<SimpleDataSetInformationDTO> listPhysicalDataSetsWithUnknownSize() throws UserFailureException; + public List<SimpleDataSetInformationDTO> listPhysicalDataSetsWithUnknownSize(int chunkSize) throws UserFailureException; /** * Updates sizes of the specified physical data sets (map key: data set code, map value: data set size). diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/plugins/FillUnknownDataSetSizeInOpenbisDBFromPathInfoDBMaintenanceTaskTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/plugins/FillUnknownDataSetSizeInOpenbisDBFromPathInfoDBMaintenanceTaskTest.java index bc3f464a72fbef6ad9d0b3dc145f9d07d94777e9..7c9f25ddb8c5e939fc018d2a830dff759b39901c 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/plugins/FillUnknownDataSetSizeInOpenbisDBFromPathInfoDBMaintenanceTaskTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/plugins/FillUnknownDataSetSizeInOpenbisDBFromPathInfoDBMaintenanceTaskTest.java @@ -17,10 +17,12 @@ package ch.systemsx.cisd.etlserver.plugins; import static ch.systemsx.cisd.common.test.ArrayContainsExactlyMatcher.containsExactly; +import static ch.systemsx.cisd.etlserver.plugins.FillUnknownDataSetSizeInOpenbisDBFromPathInfoDBMaintenanceTask.*; import java.util.Arrays; import java.util.Collections; import java.util.Map; +import java.util.Properties; import org.apache.commons.collections.map.HashedMap; import org.jmock.Expectations; @@ -29,6 +31,7 @@ import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +import ch.systemsx.cisd.common.utilities.ITimeProvider; import ch.systemsx.cisd.etlserver.path.IPathsInfoDAO; import ch.systemsx.cisd.etlserver.path.PathEntryDTO; import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; @@ -46,6 +49,8 @@ public class FillUnknownDataSetSizeInOpenbisDBFromPathInfoDBMaintenanceTaskTest private IPathsInfoDAO dao; + private ITimeProvider timeProvider; + private SimpleDataSetInformationDTO dataSet1; private SimpleDataSetInformationDTO dataSet2; @@ -62,6 +67,7 @@ public class FillUnknownDataSetSizeInOpenbisDBFromPathInfoDBMaintenanceTaskTest context = new Mockery(); service = context.mock(IEncapsulatedOpenBISService.class); dao = context.mock(IPathsInfoDAO.class); + timeProvider = context.mock(ITimeProvider.class); dataSet1 = new SimpleDataSetInformationDTO(); dataSet1.setDataSetCode("DS_1"); @@ -90,12 +96,15 @@ public class FillUnknownDataSetSizeInOpenbisDBFromPathInfoDBMaintenanceTaskTest context.checking(new Expectations() { { - one(service).listPhysicalDataSetsWithUnknownSize(); + allowing(timeProvider).getTimeInMilliseconds(); + will(returnValue(0L)); + + one(service).listPhysicalDataSetsWithUnknownSize(DEFAULT_CHUNK_SIZE); will(returnValue(Collections.emptyList())); } }); - execute(); + execute(null, null); } @Test @@ -104,12 +113,15 @@ public class FillUnknownDataSetSizeInOpenbisDBFromPathInfoDBMaintenanceTaskTest context.checking(new Expectations() { { - one(service).listPhysicalDataSetsWithUnknownSize(); + allowing(timeProvider).getTimeInMilliseconds(); + will(returnValue(0L)); + + one(service).listPhysicalDataSetsWithUnknownSize(DEFAULT_CHUNK_SIZE); will(returnValue(null)); } }); - execute(); + execute(null, null); } @Test @@ -118,15 +130,21 @@ public class FillUnknownDataSetSizeInOpenbisDBFromPathInfoDBMaintenanceTaskTest context.checking(new Expectations() { { - one(service).listPhysicalDataSetsWithUnknownSize(); + allowing(timeProvider).getTimeInMilliseconds(); + will(returnValue(0L)); + + one(service).listPhysicalDataSetsWithUnknownSize(DEFAULT_CHUNK_SIZE); will(returnValue(Arrays.asList(dataSet1))); one(dao).listDataSetsSize(new String[] { dataSet1.getDataSetCode() }); will(returnValue(Collections.emptyList())); + + one(service).listPhysicalDataSetsWithUnknownSize(DEFAULT_CHUNK_SIZE); + will(returnValue(Collections.emptyList())); } }); - execute(); + execute(null, null); } @Test @@ -135,24 +153,33 @@ public class FillUnknownDataSetSizeInOpenbisDBFromPathInfoDBMaintenanceTaskTest context.checking(new Expectations() { { - one(service).listPhysicalDataSetsWithUnknownSize(); + allowing(timeProvider).getTimeInMilliseconds(); + will(returnValue(0L)); + + one(service).listPhysicalDataSetsWithUnknownSize(DEFAULT_CHUNK_SIZE); will(returnValue(Arrays.asList(dataSet1))); one(dao).listDataSetsSize(new String[] { dataSet1.getDataSetCode() }); will(returnValue(null)); + + one(service).listPhysicalDataSetsWithUnknownSize(DEFAULT_CHUNK_SIZE); + will(returnValue(Collections.emptyList())); } }); - execute(); + execute(null, null); } @Test - public void testExecute() + public void testExecuteWithOneChunk() { context.checking(new Expectations() { { - one(service).listPhysicalDataSetsWithUnknownSize(); + allowing(timeProvider).getTimeInMilliseconds(); + will(returnValue(0L)); + + one(service).listPhysicalDataSetsWithUnknownSize(DEFAULT_CHUNK_SIZE); will(returnValue(Arrays.asList(dataSet1, dataSet2, dataSet3))); one(dao).listDataSetsSize( @@ -163,16 +190,107 @@ public class FillUnknownDataSetSizeInOpenbisDBFromPathInfoDBMaintenanceTaskTest Map<String, Long> sizeMap = new HashedMap<String, Long>(); sizeMap.put("DS_1", 123L); one(service).updatePhysicalDataSetsSize(sizeMap); + + one(service).listPhysicalDataSetsWithUnknownSize(DEFAULT_CHUNK_SIZE); + will(returnValue(Collections.emptyList())); } }); - execute(); + execute(null, null); } - private void execute() + @Test + public void testExecuteWithMultipleChunks() + { + final int chunkSize = 2; + + context.checking(new Expectations() + { + { + allowing(timeProvider).getTimeInMilliseconds(); + will(returnValue(0L)); + + one(service).listPhysicalDataSetsWithUnknownSize(chunkSize); + will(returnValue(Arrays.asList(dataSet1, dataSet2))); + + one(dao).listDataSetsSize( + with(containsExactly(dataSet1.getDataSetCode(), dataSet2.getDataSetCode()))); + will(returnValue(Arrays.asList(entry1, entry2))); + + Map<String, Long> sizeMap = new HashedMap<String, Long>(); + sizeMap.put("DS_1", 123L); + one(service).updatePhysicalDataSetsSize(sizeMap); + + one(service).listPhysicalDataSetsWithUnknownSize(chunkSize); + will(returnValue(Arrays.asList(dataSet3))); + + one(dao).listDataSetsSize(new String[] { dataSet3.getDataSetCode() }); + will(returnValue(Collections.emptyList())); + + one(service).listPhysicalDataSetsWithUnknownSize(chunkSize); + will(returnValue(Collections.emptyList())); + } + }); + + execute(null, chunkSize); + } + + @Test + public void testExecuteWithTimeLimit() + { + final long timeLimit = 10L; + final int chunkSize = 1; + + context.checking(new Expectations() + { + { + one(timeProvider).getTimeInMilliseconds(); + will(returnValue(0L)); + + one(service).listPhysicalDataSetsWithUnknownSize(chunkSize); + will(returnValue(Arrays.asList(dataSet1))); + + one(dao).listDataSetsSize(new String[] { dataSet1.getDataSetCode() }); + will(returnValue(Arrays.asList(entry1))); + + Map<String, Long> sizeMap = new HashedMap<String, Long>(); + sizeMap.put("DS_1", 123L); + one(service).updatePhysicalDataSetsSize(sizeMap); + + one(timeProvider).getTimeInMilliseconds(); + will(returnValue(8L)); + + one(service).listPhysicalDataSetsWithUnknownSize(chunkSize); + will(returnValue(Arrays.asList(dataSet2))); + + one(dao).listDataSetsSize(new String[] { dataSet2.getDataSetCode() }); + will(returnValue(Collections.emptyList())); + + one(timeProvider).getTimeInMilliseconds(); + will(returnValue(12L)); + } + }); + + execute(timeLimit, chunkSize); + } + + private void execute(Long timeLimit, Integer chunkSize) { FillUnknownDataSetSizeInOpenbisDBFromPathInfoDBMaintenanceTask task = - new FillUnknownDataSetSizeInOpenbisDBFromPathInfoDBMaintenanceTask(service, dao); + new FillUnknownDataSetSizeInOpenbisDBFromPathInfoDBMaintenanceTask(service, dao, timeProvider); + + Properties properties = new Properties(); + + if (timeLimit != null) + { + properties.setProperty(TIME_LIMIT_KEY, timeLimit.toString() + " ms"); + } + if (chunkSize != null) + { + properties.setProperty(CHUNK_SIZE_KEY, chunkSize.toString()); + } + + task.setUp("fill-unknown-sizes", properties); task.execute(); } } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ServiceForDataStoreServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ServiceForDataStoreServer.java index b8f12dd6c9801ffc824a43e2f9fd64239aff423a..ac1616f1c7592bcc77d03435fcb773c59d5c8b01 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ServiceForDataStoreServer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ServiceForDataStoreServer.java @@ -1292,13 +1292,13 @@ public class ServiceForDataStoreServer extends AbstractCommonServer<IServiceForD @Override @RolesAllowed(RoleWithHierarchy.SPACE_ETL_SERVER) - public List<SimpleDataSetInformationDTO> listPhysicalDataSetsWithUnknownSize(String sessionToken, String dataStoreCode) + public List<SimpleDataSetInformationDTO> listPhysicalDataSetsWithUnknownSize(String sessionToken, String dataStoreCode, int chunkSize) { final Session session = getSession(sessionToken); final DataStorePE dataStore = loadDataStore(session, dataStoreCode); final IDatasetLister datasetLister = businessObjectFactory.createDatasetLister(session); final List<AbstractExternalData> dataSets = - datasetLister.listByDataStoreWithUnknownSize(dataStore.getId(), + datasetLister.listByDataStoreWithUnknownSize(dataStore.getId(), chunkSize, DATASET_FETCH_OPTIONS_FILE_DATASETS); return SimpleDataSetHelper.filterAndTranslate(dataSets); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ServiceForDataStoreServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ServiceForDataStoreServerLogger.java index 177f144b56a2e336b960bcf7c9d70bb378332e77..802d3ee6ed2428bf14e1ff0b350f27aa1c083c5d 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ServiceForDataStoreServerLogger.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ServiceForDataStoreServerLogger.java @@ -417,9 +417,9 @@ public class ServiceForDataStoreServerLogger extends AbstractServerLogger implem } @Override - public List<SimpleDataSetInformationDTO> listPhysicalDataSetsWithUnknownSize(String sessionToken, String dataStoreCode) + public List<SimpleDataSetInformationDTO> listPhysicalDataSetsWithUnknownSize(String sessionToken, String dataStoreCode, int chunkSize) { - logAccess(Level.DEBUG, sessionToken, "listPhysicalDataSetsWithUnknownSize", "DATA_STORE(%s)", dataStoreCode); + logAccess(Level.DEBUG, sessionToken, "listPhysicalDataSetsWithUnknownSize", "DATA_STORE(%s) CHUNK_SIZE(%s)", dataStoreCode, chunkSize); return null; } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLister.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLister.java index d1142e75100aff60825333ab75f4f61e00c124fb..932a25ecfca2bdab4a9b7b1214e4ec6f4eb88f1f 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLister.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLister.java @@ -491,13 +491,10 @@ public class DatasetLister extends AbstractLister implements IDatasetLister } @Override - public List<AbstractExternalData> listByDataStoreWithUnknownSize(long dataStoreID, EnumSet<DataSetFetchOption> datasetFetchOptions) + public List<AbstractExternalData> listByDataStoreWithUnknownSize(long dataStoreID, int limit, EnumSet<DataSetFetchOption> datasetFetchOptions) { checkFetchOptions(datasetFetchOptions); - return orderByDate(enrichDatasets( - handleDegenerateRegistrationTimestamp( - query.getDatasetsByDataStoreIdWithUnknownSize(dataStoreID), - dataStoreID), datasetFetchOptions)); + return orderByDate(enrichDatasets(query.getDatasetsByDataStoreIdWithUnknownSize(dataStoreID, limit), datasetFetchOptions)); } private Iterable<DatasetRecord> handleDegenerateRegistrationTimestamp(List<DatasetRecord> list, diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetLister.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetLister.java index 6ca0063c3e985b3454ea6399a459a0d80e890045..e06e560196356f607975839cdb4baef27788e638 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetLister.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetLister.java @@ -128,7 +128,7 @@ public interface IDatasetLister /** * Lists physical datasets with unknown size of the specified data store. */ - List<AbstractExternalData> listByDataStoreWithUnknownSize(long dataStoreID, EnumSet<DataSetFetchOption> datasetFetchOptions); + List<AbstractExternalData> listByDataStoreWithUnknownSize(long dataStoreID, int limit, EnumSet<DataSetFetchOption> datasetFetchOptions); /** * Lists {@link DataSetShareId}s of all data sets (even those in trash) in specified data store. diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetListingQuery.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetListingQuery.java index 5bafe710d77c355f25e9136abccaecb447ed9b40..885dec3c80162eae37e77c43b1c3bfdac699ed47 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetListingQuery.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetListingQuery.java @@ -245,8 +245,8 @@ public interface IDatasetListingQuery extends BaseQuery, IPropertyListingQuery @Select(sql = SELECT_ALL_EXTERNAL_DATAS + " where data.dast_id = ?{1} and is_placeholder = false and size is null" - + " order by registration_timestamp", fetchSize = FETCH_SIZE) - public List<DatasetRecord> getDatasetsByDataStoreIdWithUnknownSize(long dataStoreID); + + " order by registration_timestamp limit ?{2}", fetchSize = FETCH_SIZE) + public List<DatasetRecord> getDatasetsByDataStoreIdWithUnknownSize(long dataStoreID, int limit); // NOTE: we list ALL data sets (even those in trash) using data_all table here @Select(sql = "SELECT code, share_id FROM data_all LEFT OUTER JOIN external_data " diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IServiceForDataStoreServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IServiceForDataStoreServer.java index 95461422b5eaac1f10abad65cb87ee5f5af4997a..f5661abb241963e5faae7bab49656d24bae3aa84 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IServiceForDataStoreServer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IServiceForDataStoreServer.java @@ -437,7 +437,7 @@ public interface IServiceForDataStoreServer extends IServer, ISessionProvider * Returns informations about physical data sets with unknown size that belong to the specified data store server. */ @Transactional(readOnly = true) - public List<SimpleDataSetInformationDTO> listPhysicalDataSetsWithUnknownSize(String sessionToken, String dataStoreCode); + public List<SimpleDataSetInformationDTO> listPhysicalDataSetsWithUnknownSize(String sessionToken, String dataStoreCode, int chunkSize); /** * Updates sizes of the specified physical data sets (map key: data set code, map value: data set size). diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ServiceForDataStoreServerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ServiceForDataStoreServerTest.java index d330f60814300c4aedb6bb71a0cfa1af2757e324..22d86700e7aa44b0a07963a1e1a97b60440a5afe 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ServiceForDataStoreServerTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ServiceForDataStoreServerTest.java @@ -41,12 +41,13 @@ public class ServiceForDataStoreServerTest extends SystemTestCase public void testListPhysicalDataSetsWithUnknownSize() { String sessionToken = authenticateAs("test"); - List<SimpleDataSetInformationDTO> dataSetsWithUnknownSize = etlService.listPhysicalDataSetsWithUnknownSize(sessionToken, "STANDARD"); + List<SimpleDataSetInformationDTO> dataSetsWithUnknownSize = etlService.listPhysicalDataSetsWithUnknownSize(sessionToken, "STANDARD", 3); sortByCode(dataSetsWithUnknownSize); - Assert.assertEquals(20, dataSetsWithUnknownSize.size()); + Assert.assertEquals(3, dataSetsWithUnknownSize.size()); Assert.assertEquals("20081105092159188-3", dataSetsWithUnknownSize.get(0).getDataSetCode()); - Assert.assertEquals("VALIDATIONS_PARENT-28", dataSetsWithUnknownSize.get(dataSetsWithUnknownSize.size() - 1).getDataSetCode()); + Assert.assertEquals("20081105092259000-8", dataSetsWithUnknownSize.get(1).getDataSetCode()); + Assert.assertEquals("20081105092259000-9", dataSetsWithUnknownSize.get(2).getDataSetCode()); } @Test(dependsOnMethods = "testListPhysicalDataSetsWithUnknownSize") @@ -59,7 +60,7 @@ public class ServiceForDataStoreServerTest extends SystemTestCase etlService.updatePhysicalDataSetsSize(sessionToken, sizeMap); - List<SimpleDataSetInformationDTO> dataSetsWithUnknownSize = etlService.listPhysicalDataSetsWithUnknownSize(sessionToken, "STANDARD"); + List<SimpleDataSetInformationDTO> dataSetsWithUnknownSize = etlService.listPhysicalDataSetsWithUnknownSize(sessionToken, "STANDARD", 100); List<AbstractExternalData> updatedDataSets = etlService.listDataSetsByCode(sessionToken, Arrays.asList("20081105092159188-3")); sortByCode(dataSetsWithUnknownSize);