From 36a56100470bcc5537e57dcac0992ad53b0cdff1 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Tue, 11 Aug 2015 19:18:27 +0200 Subject: [client] Back off with reconnects for file transfers if it fails too often --- .../openslx/dozmod/filetransfer/TransferTask.java | 32 ++++++++++++---------- 1 file changed, 18 insertions(+), 14 deletions(-) (limited to 'dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferTask.java') 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 transfers = new ArrayList<>(); private final List 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() { -- cgit v1.2.3-55-g7522