diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/logging/MockLogger.java b/common/sourceTest/java/ch/systemsx/cisd/common/logging/MockLogger.java new file mode 100644 index 0000000000000000000000000000000000000000..a57e88cf342ffa78558781e60e8f7f57ad259ba7 --- /dev/null +++ b/common/sourceTest/java/ch/systemsx/cisd/common/logging/MockLogger.java @@ -0,0 +1,54 @@ +/* + * Copyright 2011 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.systemsx.cisd.common.logging; + +import ch.systemsx.cisd.common.concurrent.MessageChannel; +import ch.systemsx.cisd.common.logging.ISimpleLogger; +import ch.systemsx.cisd.common.logging.LogLevel; + +/** + * A logger which records logging events. Log messages also sent to a {@link MessageChannel}. + * + * @author Franz-Josef Elmer + */ +public final class MockLogger implements ISimpleLogger +{ + private final StringBuilder builder = new StringBuilder(); + private final MessageChannel messageChannel = new MessageChannel(); + + public void log(LogLevel level, String message) + { + builder.append(level).append(": ").append(message).append('\n'); + messageChannel.send(message); + } + + public void assertNextLogMessage(String expectedMessage) + { + messageChannel.assertNextMessage(expectedMessage); + } + + public void assertNoMoreLogMessages() + { + messageChannel.assertEmpty(); + } + + @Override + public String toString() + { + return builder.toString(); + } +} \ No newline at end of file diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataSetDirectoryProvider.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataSetDirectoryProvider.java index 516bd86a7f4d8fc40b5cfabb895b972d2042fd30..0d9e7a70a4111d2c0fe3f7f9179148ca9512bba0 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataSetDirectoryProvider.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataSetDirectoryProvider.java @@ -51,4 +51,9 @@ public class DataSetDirectoryProvider implements IDataSetDirectoryProvider return new File(share, location); } + public IShareIdManager getShareIdManager() + { + return shareIdManager; + } + } diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DeletionCommand.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DeletionCommand.java index 9b42683589b656ddb7faef55d9e6f9e6bd12bb61..b56610bba4a3673a1b80580913cabb88f61e75cd 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DeletionCommand.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DeletionCommand.java @@ -18,17 +18,20 @@ package ch.systemsx.cisd.openbis.dss.generic.server; import java.io.File; import java.util.List; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import org.apache.log4j.Logger; -import ch.systemsx.cisd.common.TimingParameters; -import ch.systemsx.cisd.common.filesystem.FileOperations; -import ch.systemsx.cisd.common.filesystem.IFileRemover; -import ch.systemsx.cisd.common.filesystem.LoggingPathRemoverDecorator; +import ch.rinn.restrictions.Private; +import ch.systemsx.cisd.common.logging.ISimpleLogger; import ch.systemsx.cisd.common.logging.Log4jSimpleLogger; import ch.systemsx.cisd.common.logging.LogCategory; import ch.systemsx.cisd.common.logging.LogFactory; import ch.systemsx.cisd.openbis.dss.generic.shared.IDataSetDirectoryProvider; +import ch.systemsx.cisd.openbis.dss.generic.shared.IShareIdManager; +import ch.systemsx.cisd.openbis.dss.generic.shared.utils.SegmentedStoreUtils; import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription; /** @@ -43,24 +46,38 @@ class DeletionCommand extends AbstractDataSetDescriptionBasedCommand private final static Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, DeletionCommand.class); - private static final IFileRemover remover = new LoggingPathRemoverDecorator( - FileOperations.createMonitoredInstance(TimingParameters.getDefaultParameters()), - new Log4jSimpleLogger(operationLog), false); - DeletionCommand(List<DatasetDescription> dataSets) { super(dataSets); } - public void execute(IDataSetDirectoryProvider dataSetDirectoryProvider) + public void execute(final IDataSetDirectoryProvider dataSetDirectoryProvider) { - for (DatasetDescription dataSet : dataSets) + final IShareIdManager shareIdManager = dataSetDirectoryProvider.getShareIdManager(); + final ISimpleLogger logger = createLogger(); + ThreadPoolExecutor executor = + new ThreadPoolExecutor(1, 10, 360, TimeUnit.SECONDS, + new LinkedBlockingQueue<Runnable>()); + for (final DatasetDescription dataSet : dataSets) { - File dataSetDirectory = dataSetDirectoryProvider.getDataSetDirectory(dataSet); - remover.removeRecursively(dataSetDirectory); + executor.submit(new Runnable() + { + public void run() + { + File dataSetDirectory = + dataSetDirectoryProvider.getDataSetDirectory(dataSet); + SegmentedStoreUtils.deleteDataSet(dataSet.getDatasetCode(), + dataSetDirectory, shareIdManager, logger); + } + }); } } + @Private ISimpleLogger createLogger() + { + return new Log4jSimpleLogger(operationLog); + } + public String getDescription() { final StringBuilder b = new StringBuilder(); diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IDataSetDirectoryProvider.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IDataSetDirectoryProvider.java index 193b1eb10692a3bb6d63c864b52e7f42124b6618..9f3e0f8c76811b0a18f058a2f970acc101a0ba68 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IDataSetDirectoryProvider.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IDataSetDirectoryProvider.java @@ -36,4 +36,10 @@ public interface IDataSetDirectoryProvider * Returns the root directory of specified data set. */ public File getDataSetDirectory(DatasetDescription dataSet); + + /** + * Returns the share id manager which is used for + * {@link #getDataSetDirectory(DatasetDescription)}. + */ + public IShareIdManager getShareIdManager(); } diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtils.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtils.java index 215631717d14e7b5c67f3d45562b5d0752d69ba9..9a5d414e8ae4c4a569eb707d2bc4714c8e388fa2 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtils.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtils.java @@ -253,18 +253,35 @@ public class SegmentedStoreUtils { public void run() { - logger.log(LogLevel.INFO, "Await for data set " + dataSetCode - + " to be unlocked."); - shareIdManager.await(dataSetCode); - logger.log(LogLevel.INFO, "Start deleting data set " + dataSetCode + " at " - + dataSetDirInStore); - FileUtilities.deleteRecursively(dataSetDirInStore); - logger.log(LogLevel.INFO, "Data set " + dataSetCode + " at " - + dataSetDirInStore + " has been deleted."); + deleteDataSet(dataSetCode, dataSetDirInStore, shareIdManager, logger); } }).start(); } + /** + * Deletes specified data set at specified location. This methods waits until any locks + * on the specified data set have been released. + */ + public static void deleteDataSet(final String dataSetCode, final File dataSetDirInStore, + final IShareIdManager shareIdManager, final ISimpleLogger logger) + { + logger.log(LogLevel.INFO, "Await for data set " + dataSetCode + + " to be unlocked."); + shareIdManager.await(dataSetCode); + logger.log(LogLevel.INFO, "Start deleting data set " + dataSetCode + " at " + + dataSetDirInStore); + boolean successful = FileUtilities.deleteRecursively(dataSetDirInStore); + if (successful) + { + logger.log(LogLevel.INFO, "Data set " + dataSetCode + " at " + dataSetDirInStore + + " has been successfully deleted."); + } else + { + logger.log(LogLevel.WARN, "Deletion of data set " + dataSetCode + " at " + + dataSetDirInStore + " failed."); + } + } + private static void copyToShare(File file, File share) { RsyncCopier copier = new RsyncCopier(OSUtilities.findExecutable(RSYNC_EXEC)); diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/UploadingCommandTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/UploadingCommandTest.java index 635420e70f6014abb2f4dc7d73e70cede8ad7173..fca455531a98d25da1f303c18c307266e4d28946 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/UploadingCommandTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/UploadingCommandTest.java @@ -50,6 +50,7 @@ import ch.systemsx.cisd.common.filesystem.FileUtilities; import ch.systemsx.cisd.common.logging.BufferedAppender; import ch.systemsx.cisd.common.mail.MailClientParameters; import ch.systemsx.cisd.openbis.dss.generic.shared.IDataSetDirectoryProvider; +import ch.systemsx.cisd.openbis.dss.generic.shared.IShareIdManager; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData; import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE; import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetTypePE; @@ -88,6 +89,11 @@ public class UploadingCommandTest extends AssertJUnit { return new File(new File(getStoreRoot(), SHARE_ID), dataSet.getDataSetLocation()); } + + public IShareIdManager getShareIdManager() + { + return null; + } } private static final String ZIP_FILENAME = "myData"; diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/MockDataSetDirectoryProvider.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/MockDataSetDirectoryProvider.java index 8852381d70bc2c85459a47599033466f3365d761..28bc5c797b84c03cdee6d9e50ad1c39f8a26c14b 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/MockDataSetDirectoryProvider.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/MockDataSetDirectoryProvider.java @@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard; import java.io.File; import ch.systemsx.cisd.openbis.dss.generic.shared.IDataSetDirectoryProvider; +import ch.systemsx.cisd.openbis.dss.generic.shared.IShareIdManager; import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription; public final class MockDataSetDirectoryProvider implements IDataSetDirectoryProvider @@ -41,4 +42,9 @@ public final class MockDataSetDirectoryProvider implements IDataSetDirectoryProv { return new File(new File(getStoreRoot(), shareID), dataSet.getDataSetLocation()); } + + public IShareIdManager getShareIdManager() + { + return null; + } } \ No newline at end of file diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtilsTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtilsTest.java index 32ffaf111cc0fa8206c92c695bbfcc90b979139e..1fe827f02783570931d9e59a0d4c8c053a715c10 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtilsTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtilsTest.java @@ -29,12 +29,10 @@ import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase; -import ch.systemsx.cisd.common.concurrent.MessageChannel; import ch.systemsx.cisd.common.filesystem.FileUtilities; import ch.systemsx.cisd.common.filesystem.HostAwareFile; import ch.systemsx.cisd.common.filesystem.IFreeSpaceProvider; -import ch.systemsx.cisd.common.logging.ISimpleLogger; -import ch.systemsx.cisd.common.logging.LogLevel; +import ch.systemsx.cisd.common.logging.MockLogger; import ch.systemsx.cisd.common.test.RecordingMatcher; import ch.systemsx.cisd.common.utilities.ITimeProvider; import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; @@ -49,34 +47,6 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.SimpleDataSetInformationDTO; */ public class SegmentedStoreUtilsTest extends AbstractFileSystemTestCase { - private static final class MockLogger implements ISimpleLogger - { - private final StringBuilder builder = new StringBuilder(); - private final MessageChannel messageChannel = new MessageChannel(); - - public void log(LogLevel level, String message) - { - builder.append(level).append(": ").append(message).append('\n'); - messageChannel.send(message); - } - - public void assertNextLogMessage(String expectedMessage) - { - messageChannel.assertNextMessage(expectedMessage); - } - - public void assertNoMoreLogMessages() - { - messageChannel.assertEmpty(); - } - - @Override - public String toString() - { - return builder.toString(); - } - } - private static final String DATA_STORE_CODE = "ds-code"; private Mockery context; @@ -229,7 +199,7 @@ public class SegmentedStoreUtilsTest extends AbstractFileSystemTestCase log.assertNextLogMessage("Start deleting data set ds-1 at " + share1 + "/uuid/01/02/03/ds-1"); log.assertNextLogMessage("Data set ds-1 at " + share1 - + "/uuid/01/02/03/ds-1 has been deleted."); + + "/uuid/01/02/03/ds-1 has been successfully deleted."); assertEquals(false, dataSetDirInStore.exists()); assertFileNames(share2uuid01, "02", "22"); assertEquals("hello world\n",