diff --git a/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/intf/FileStore.java b/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/intf/FileStore.java index ccc2ea76ec33568fc913ff85ad5bd5e699ac26e8..965eb8b69aa92c5cdae7d17bf3c971de5eb64cfa 100644 --- a/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/intf/FileStore.java +++ b/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/intf/FileStore.java @@ -28,6 +28,7 @@ import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; import ch.systemsx.cisd.common.exceptions.Status; import ch.systemsx.cisd.common.highwatermark.FileWithHighwaterMark; import ch.systemsx.cisd.common.highwatermark.HighwaterMarkSelfTestable; +import ch.systemsx.cisd.common.highwatermark.HighwaterMarkWatcher; import ch.systemsx.cisd.common.utilities.StoreItem; import ch.systemsx.cisd.datamover.filesystem.remote.RemotePathMover; @@ -49,12 +50,12 @@ public abstract class FileStore implements IFileStore protected final IFileSysOperationsFactory factory; - protected FileStore(final FileWithHighwaterMark path, final String hostOrNull, + protected FileStore(final FileWithHighwaterMark fileWithHighwaterMark, final String hostOrNull, final boolean remote, final String kind, final IFileSysOperationsFactory factory) { - assert path != null; + assert fileWithHighwaterMark != null; assert kind != null; - this.fileWithHighwaterMark = path; + this.fileWithHighwaterMark = fileWithHighwaterMark; this.kind = kind; this.hostOrNull = hostOrNull; this.remote = remote; @@ -79,7 +80,8 @@ public abstract class FileStore implements IFileStore public final StoreItemLocation getStoreItemLocation(StoreItem item) { - return new StoreItemLocation(hostOrNull, StoreItem.asFile(getPath(), item).getAbsolutePath()); + return new StoreItemLocation(hostOrNull, StoreItem.asFile(getPath(), item) + .getAbsolutePath()); } protected final File getPath() @@ -172,7 +174,8 @@ public abstract class FileStore implements IFileStore { throw new ConfigurationFailureException(errorMessage); } - new HighwaterMarkSelfTestable(fileWithHighwaterMark.getFile(), getHighwaterMarkWatcher()) + final HighwaterMarkWatcher highwaterMarkWatcher = getHighwaterMarkWatcher(); + new HighwaterMarkSelfTestable(fileWithHighwaterMark.getFile(), highwaterMarkWatcher) .check(); } diff --git a/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/intf/IFileStore.java b/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/intf/IFileStore.java index 0546ae8a954b0022856f833000f0d339a67af820..8b60e1e1ea0981040c0a3fccd096821a5842acbc 100644 --- a/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/intf/IFileStore.java +++ b/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/intf/IFileStore.java @@ -41,15 +41,15 @@ public interface IFileStore extends ISelfTestable * share and mounted via NFS or CIFS. */ public boolean isRemote(); - + /** * Returns the location of the specified store item. */ public StoreItemLocation getStoreItemLocation(StoreItem item); /** - * Returns <code>true</code> if this file store is the parent directory of - * the specified file store. + * Returns <code>true</code> if this file store is the parent directory of the specified file + * store. */ public boolean isParentDirectory(IFileStore child); @@ -120,12 +120,15 @@ public interface IFileStore extends ISelfTestable /** * Returns this file store as an extended file store if possible. * - * @return <code>null</code> if this file store can not be returned as an extended file store. + * @return <code>null</code> if this file store can not be returned as an extended file store. */ public IExtendedFileStore tryAsExtended(); /** * Returns the <code>HighwaterMarkWatcher</code> for this implementation. + * <p> + * Note that we expect the path to be set in the returned <code>HighwaterMarkWatcher</code>. + * </p> */ public HighwaterMarkWatcher getHighwaterMarkWatcher(); } \ No newline at end of file diff --git a/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/remote/RemotePathMover.java b/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/remote/RemotePathMover.java index fd8781627710d62129d52cfa1de3c96aaacacfd8..c3ad6090e197de5cd1c472a1fbe63b4bf6dae1df 100644 --- a/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/remote/RemotePathMover.java +++ b/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/remote/RemotePathMover.java @@ -22,6 +22,7 @@ import org.apache.log4j.Logger; import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException; import ch.systemsx.cisd.common.exceptions.Status; import ch.systemsx.cisd.common.exceptions.StatusFlag; +import ch.systemsx.cisd.common.highwatermark.HighwaterMarkWatcher; import ch.systemsx.cisd.common.logging.LogCategory; import ch.systemsx.cisd.common.logging.LogFactory; import ch.systemsx.cisd.common.utilities.IStoreHandler; @@ -291,9 +292,13 @@ public final class RemotePathMover implements IStoreHandler // IStoreHandler // - public final boolean mayHandle(StoreItem item) + public final boolean mayHandle(final StoreItem item) { - return true; + final HighwaterMarkWatcher highwaterMarkWatcher = + destinationDirectory.getHighwaterMarkWatcher(); + assert highwaterMarkWatcher.getPath() != null : "Remote path not set"; + highwaterMarkWatcher.run(); + return highwaterMarkWatcher.isBelow() == false; } public final void handle(final StoreItem item) @@ -304,11 +309,8 @@ public final class RemotePathMover implements IStoreHandler // finish the job. if (operationLog.isInfoEnabled()) { - operationLog - .info(String - .format( - "Detected recovery situation: '%s' has been interrupted in deletion phase, finishing up.", - getSrcPath(item))); + operationLog.info(String.format("Detected recovery situation: '%s' has been " + + "interrupted in deletion phase, finishing up.", getSrcPath(item))); } removeAndMark(item); return; @@ -371,7 +373,6 @@ public final class RemotePathMover implements IStoreHandler // here. } } while (true); - notificationLog.error(String.format(MOVING_PATH_TO_REMOTE_FAILED_TEMPLATE, getSrcPath(item), destinationDirectory)); } diff --git a/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/store/FileStoreLocal.java b/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/store/FileStoreLocal.java index a4cc889c4991dd09a0f353b94dc67d6da5b613cf..aadfe1d2372e6a83cbc233e4953b14f197aaf2e3 100644 --- a/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/store/FileStoreLocal.java +++ b/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/store/FileStoreLocal.java @@ -54,13 +54,22 @@ public class FileStoreLocal extends FileStore implements IExtendedFileStore private final HighwaterMarkWatcher highwaterMarkWatcher; - public FileStoreLocal(final FileWithHighwaterMark file, final String desription, - final IFileSysOperationsFactory factory) + public FileStoreLocal(final FileWithHighwaterMark highwaterMarkWatcher, + final String desription, final IFileSysOperationsFactory factory) { - super(file, null, false, desription, factory); + super(highwaterMarkWatcher, null, false, desription, factory); this.remover = factory.getRemover(); this.mover = factory.getMover(); - this.highwaterMarkWatcher = new HighwaterMarkWatcher(file.getHighwaterMark()); + this.highwaterMarkWatcher = createHighwaterMarkWatcher(highwaterMarkWatcher); + } + + private final static HighwaterMarkWatcher createHighwaterMarkWatcher( + final FileWithHighwaterMark fileWithHighwaterMark) + { + final HighwaterMarkWatcher highwaterMarkWatcher = + new HighwaterMarkWatcher(fileWithHighwaterMark.getHighwaterMark()); + highwaterMarkWatcher.setPath(fileWithHighwaterMark.getFile()); + return highwaterMarkWatcher; } public final Status delete(final StoreItem item) diff --git a/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/store/FileStoreRemote.java b/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/store/FileStoreRemote.java index 84781c0800d96a86e304cccc9d3ad1e01b9ea678..2789c72fbd1cda9ac6160a1cf97148fae5a50e18 100644 --- a/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/store/FileStoreRemote.java +++ b/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/store/FileStoreRemote.java @@ -48,16 +48,17 @@ public class FileStoreRemote extends FileStore private final HighwaterMarkWatcher highwaterMarkWatcher; - public FileStoreRemote(final FileWithHighwaterMark path, final String host, final String kind, - final IFileSysOperationsFactory factory) + public FileStoreRemote(final FileWithHighwaterMark fileWithHighwaterMark, final String host, + final String kind, final IFileSysOperationsFactory factory) { - super(path, host, true, kind, factory); + super(fileWithHighwaterMark, host, true, kind, factory); assert host != null : "Unspecified host"; - highwaterMarkWatcher = createHighwaterMarkWatcher(path.getHighwaterMark(), host); + highwaterMarkWatcher = createHighwaterMarkWatcher(fileWithHighwaterMark, host, factory); } - private final HighwaterMarkWatcher createHighwaterMarkWatcher(final long highwaterMark, - final String host) + private final static HighwaterMarkWatcher createHighwaterMarkWatcher( + final FileWithHighwaterMark fileWithHighwaterMark, final String host, + final IFileSysOperationsFactory factory) { final File sshExecutable = factory.tryFindSshExecutable(); final IFreeSpaceProvider freeSpaceProvider; @@ -70,7 +71,11 @@ public class FileStoreRemote extends FileStore + "('ssh' executable not found)."); freeSpaceProvider = AlwaysAboveFreeSpaceProvider.INSTANCE; } - return new HighwaterMarkWatcher(highwaterMark, freeSpaceProvider); + final HighwaterMarkWatcher highwaterMarkWatcher = + new HighwaterMarkWatcher(fileWithHighwaterMark.getHighwaterMark(), + freeSpaceProvider); + highwaterMarkWatcher.setPath(fileWithHighwaterMark.getFile()); + return highwaterMarkWatcher; } //