diff options
author | Simon Rettberg | 2015-08-11 19:18:27 +0200 |
---|---|---|
committer | Simon Rettberg | 2015-08-11 19:18:27 +0200 |
commit | 36a56100470bcc5537e57dcac0992ad53b0cdff1 (patch) | |
tree | f601e5f2962cc3aee4845929f397b06cebb7dd71 /dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferTask.java | |
parent | [client] Invalidate lecture list after creating new lecture (diff) | |
download | tutor-module-36a56100470bcc5537e57dcac0992ad53b0cdff1.tar.gz tutor-module-36a56100470bcc5537e57dcac0992ad53b0cdff1.tar.xz tutor-module-36a56100470bcc5537e57dcac0992ad53b0cdff1.zip |
[client] Back off with reconnects for file transfers if it fails too often
Diffstat (limited to 'dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferTask.java')
-rw-r--r-- | dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferTask.java | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferTask.java b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferTask.java index 45efe72f..72f4f6e0 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferTask.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferTask.java @@ -4,6 +4,7 @@ import java.io.File; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; import org.apache.log4j.Logger; import org.openslx.bwlp.thrift.iface.TransferState; @@ -26,6 +27,8 @@ public abstract class TransferTask implements Runnable { protected final List<TransferThread> transfers = new ArrayList<>(); private final List<TransferThread> connectingTransfers = new ArrayList<>(); + protected final AtomicInteger consecutiveInitFails = new AtomicInteger(); + /** * List of listeners that want to get status updates about the transfer. */ @@ -35,7 +38,7 @@ public abstract class TransferTask implements Runnable { private volatile boolean isCancelled = false; private boolean endgame = false; private int minConnectionCount = 1; - private int failCount = 0; + private long lastConnectionAttempt = 0; protected final File localFile; protected final long fileSize; @@ -149,14 +152,19 @@ public abstract class TransferTask implements Runnable { it.remove(); } } + if (transfers.size() + connectingTransfers.size() >= minConnectionCount) + return; - if (transfers.size() + connectingTransfers.size() < minConnectionCount) { - TransferThread thread = createNewThread(); - if (thread != null) { - thread.setDaemon(true); - connectingTransfers.add(thread); - thread.start(); - } + long now = System.currentTimeMillis(); + int fails = consecutiveInitFails.get(); + if (lastConnectionAttempt + fails * 10000 > now) + return; + lastConnectionAttempt = now; + TransferThread thread = createNewThread(); + if (thread != null) { + thread.setDaemon(true); + connectingTransfers.add(thread); + thread.start(); } } } @@ -168,7 +176,6 @@ public abstract class TransferTask implements Runnable { connectingTransfers.remove(thread); if (transfers.size() > 0) return; - failCount++; } } @@ -177,7 +184,6 @@ public abstract class TransferTask implements Runnable { connectingTransfers.remove(thread); if (!isCancelled) { transfers.add(thread); - failCount = 0; return; } } @@ -213,10 +219,8 @@ public abstract class TransferTask implements Runnable { * * @return connect fails */ - public final int getConnectFailCount() { - synchronized (transfers) { - return failCount; - } + public final int getFailCount() { + return consecutiveInitFails.get(); } public int getTransferCount() { |