diff options
Diffstat (limited to 'dozentenmodul/src/main')
4 files changed, 34 insertions, 21 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/DownloadTask.java b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/DownloadTask.java index ec4f5f18..03abada4 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/DownloadTask.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/DownloadTask.java @@ -35,7 +35,6 @@ public class DownloadTask extends TransferTask { private final RandomAccessFile fileHandle; private final ChunkList chunks; private boolean fileWritable = true; - private AtomicInteger consecutiveInitFails = new AtomicInteger(); public DownloadTask(String host, int port, String downloadToken, File destinationFile, long fileSize, List<ByteBuffer> sha1Sums) throws FileNotFoundException { @@ -128,6 +127,7 @@ public class DownloadTask extends TransferTask { downloader = new Downloader(host, port, Config.TRANSFER_TIMEOUT, null, downloadToken); } catch (Exception e) { LOGGER.warn("Could not initialize new uploader", e); + consecutiveInitFails.incrementAndGet(); connectFailed(this); return; } // TODO: SSL @@ -168,6 +168,9 @@ public class DownloadTask extends TransferTask { if (consecutiveInitFails.get() > 20) { state = TransferState.ERROR; error = "Cannot talk to server after 20 tries..."; + } else if (chunks.isComplete()) { + state = TransferState.FINISHED; + error = null; } else { state = TransferState.WORKING; error = null; 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() { diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/UploadTask.java b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/UploadTask.java index b0655115..f7f5fca7 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/UploadTask.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/UploadTask.java @@ -33,7 +33,7 @@ public class UploadTask extends TransferTask { private final String host; private final int port; private final String uploadToken; - + public UploadTask(String host, int port, String uploadToken, File uploadFile) throws FileNotFoundException { super(uploadFile, uploadFile.length()); @@ -46,7 +46,7 @@ public class UploadTask extends TransferTask { } private class UploadThread extends TransferThread { -// private long totalBytesRead = 0; + // private long totalBytesRead = 0; private long currentSpeed = 0; private Uploader uploader = null; @@ -56,6 +56,7 @@ public class UploadTask extends TransferTask { uploader = new Uploader(host, port, Config.TRANSFER_TIMEOUT, null, uploadToken); } catch (Exception e) { LOGGER.warn("Could not initialize new uploader", e); + consecutiveInitFails.incrementAndGet(); connectFailed(this); return; } // TODO: SSL @@ -75,7 +76,7 @@ public class UploadTask extends TransferTask { if (lastUpdate + UPDATE_INTERVAL_MS < now) { synchronized (thread) { // Calculate updated speed -// totalBytesRead += currentBytes; + // totalBytesRead += currentBytes; lastBytes = (lastBytes * 2 + currentBytes) / 3; currentSpeed = (1000 * lastBytes) / (now - lastUpdate); lastUpdate = now; @@ -90,9 +91,14 @@ public class UploadTask extends TransferTask { fireErrorMessage(message); } }); + if (ret) { + consecutiveInitFails.set(0); + } else { + consecutiveInitFails.incrementAndGet(); + } transferEnded(this, ret); } - + @Override public long getCurrentSpeed() { synchronized (this) { @@ -142,7 +148,7 @@ public class UploadTask extends TransferTask { missing++; } } - final long bytesRemaining = CHUNK_SIZE * (long)missing; + final long bytesRemaining = CHUNK_SIZE * (long) missing; timeRemaining = (1000 * bytesRemaining) / (speed + 1); } TransferEvent event = new TransferEvent(state, blocks, speed, timeRemaining, error); diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java index a4675f15..4802256b 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java @@ -205,7 +205,7 @@ public class ImageUploadPage extends ImageUploadPageLayout { new Thread(state.uploadTask).start(); do { Util.sleep(5); - } while (state.uploadTask.getConnectFailCount() == 0 && state.uploadTask.getTransferCount() == 0 + } while (state.uploadTask.getFailCount() == 0 && state.uploadTask.getTransferCount() == 0 && !state.uploadTask.isCanceled()); } |