summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/openslx/filetransfer/util/AbstractTransfer.java
diff options
context:
space:
mode:
authorSimon Rettberg2016-04-13 18:38:47 +0200
committerSimon Rettberg2016-04-13 18:38:47 +0200
commit34ca2905c38d17bbded01cf7497eca790e760a39 (patch)
tree4dbaff08d7f88d48e685bd514b907c8d77571f16 /src/main/java/org/openslx/filetransfer/util/AbstractTransfer.java
parentremove ruleId from NetRule struct (diff)
downloadmaster-sync-shared-34ca2905c38d17bbded01cf7497eca790e760a39.tar.gz
master-sync-shared-34ca2905c38d17bbded01cf7497eca790e760a39.tar.xz
master-sync-shared-34ca2905c38d17bbded01cf7497eca790e760a39.zip
Preparations/changes for global image sync
Diffstat (limited to 'src/main/java/org/openslx/filetransfer/util/AbstractTransfer.java')
-rw-r--r--src/main/java/org/openslx/filetransfer/util/AbstractTransfer.java133
1 files changed, 133 insertions, 0 deletions
diff --git a/src/main/java/org/openslx/filetransfer/util/AbstractTransfer.java b/src/main/java/org/openslx/filetransfer/util/AbstractTransfer.java
new file mode 100644
index 0000000..75c68e8
--- /dev/null
+++ b/src/main/java/org/openslx/filetransfer/util/AbstractTransfer.java
@@ -0,0 +1,133 @@
+package org.openslx.filetransfer.util;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.openslx.bwlp.thrift.iface.TransferInformation;
+
+public abstract class AbstractTransfer
+{
+
+ /**
+ * How long to keep this transfer information when the transfer is
+ * (potentially) done
+ */
+ private static final long FINISH_TIMEOUT = TimeUnit.MINUTES.toMillis( 3 );
+
+ /**
+ * How long to keep this transfer information when there are no active
+ * connections and the transfer seems unfinished
+ */
+ private static final long IDLE_TIMEOUT = TimeUnit.HOURS.toMillis( 6 );
+
+ /**
+ * How long to count this transfer towards active transfers when it has
+ * no active connection.
+ */
+ private static final long HOT_IDLE_TIMEOUT = TimeUnit.MINUTES.toMillis( 10 );
+ /**
+ * Time stamp of when (we think) the transfer finished. Clients can/might
+ * not tell us they're done, and simply taking "no active connection" as a
+ * sign the download is done might have unwanted effects if the user's
+ * connection drops for a minute. If this time stamp (plus a FINISH_TIMEOUT)
+ * passed,
+ * we consider the download done and flag it for removal.
+ * If set to zero, the transfer is not finished, or not assumed to have
+ * finished.
+ */
+ protected final AtomicLong potentialFinishTime = new AtomicLong( 0 );
+
+ /**
+ * Time of last activity on this transfer.
+ */
+ protected final AtomicLong lastActivityTime = new AtomicLong( System.currentTimeMillis() );
+
+ private final String transferId;
+
+ public AbstractTransfer( String transferId )
+ {
+ this.transferId = transferId;
+ }
+
+ /**
+ * Returns true if the transfer is considered completed.
+ *
+ * @param now pass System.currentTimeMillis()
+ * @return true if the transfer is considered completed
+ */
+ public boolean isComplete( long now )
+ {
+ long val = potentialFinishTime.get();
+ return val != 0 && val + FINISH_TIMEOUT < now;
+ }
+
+ /**
+ * Returns true if there has been no activity on this transfer for a certain
+ * amount of time.
+ *
+ * @param now pass System.currentTimeMillis()
+ * @return true if the transfer reached its idle timeout
+ */
+ public final boolean hasReachedIdleTimeout( long now )
+ {
+ return getActiveConnectionCount() == 0 && lastActivityTime.get() + IDLE_TIMEOUT < now;
+ }
+
+ public final boolean countsTowardsConnectionLimit( long now )
+ {
+ return getActiveConnectionCount() > 0 || lastActivityTime.get() + HOT_IDLE_TIMEOUT > now;
+ }
+
+ public final String getId()
+ {
+ return transferId;
+ }
+
+ public abstract TransferInformation getTransferInfo();
+
+ /**
+ * Returns true if this transfer would potentially accept new connections.
+ * This should NOT return false if there are too many concurrent
+ * connections, as this is used to signal the client whether to keep trying
+ * to connect.
+ *
+ * @return true if this transfer would potentially accept new connections
+ */
+ public abstract boolean isActive();
+
+ /**
+ * Cancel this transfer, aborting all active connections and rejecting
+ * further incoming ones.
+ */
+ public abstract void cancel();
+
+ /**
+ * Returns number of active transfer connections.
+ *
+ * @return number of active transfer connections
+ */
+ public abstract int getActiveConnectionCount();
+
+ public abstract String getRelativePath();
+
+ /**
+ * Try to close everything passed to this method. Never throw an exception
+ * if it fails, just silently continue.
+ *
+ * @param item One or more objects that are AutoCloseable
+ */
+ static void safeClose( AutoCloseable... item )
+ {
+ if ( item == null )
+ return;
+ for ( AutoCloseable c : item ) {
+ if ( c == null )
+ continue;
+ try {
+ c.close();
+ } catch ( Exception e ) {
+ }
+ }
+ }
+
+}