diff options
author | Simon Rettberg | 2015-09-30 13:45:10 +0200 |
---|---|---|
committer | Simon Rettberg | 2015-09-30 13:45:10 +0200 |
commit | 2e7c0179cf83bda3a26589d7b6c3c852adf4df41 (patch) | |
tree | c5feee4daf97c55c18bbca4d8dd6e43c5638b2fa | |
parent | [client] Added "Show linking lectures" button im imageDetailsW. (diff) | |
download | tutor-module-2e7c0179cf83bda3a26589d7b6c3c852adf4df41.tar.gz tutor-module-2e7c0179cf83bda3a26589d7b6c3c852adf4df41.tar.xz tutor-module-2e7c0179cf83bda3a26589d7b6c3c852adf4df41.zip |
[server] Fix transfer timeout detection and active counting
4 files changed, 30 insertions, 20 deletions
diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/AbstractTransfer.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/AbstractTransfer.java index dc57cb1b..f164e5a6 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/AbstractTransfer.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/AbstractTransfer.java @@ -15,9 +15,14 @@ public abstract class AbstractTransfer { * 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(4); + 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(15); + /** * 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 @@ -62,6 +67,10 @@ public abstract class AbstractTransfer { 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; } diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/FileServer.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/FileServer.java index 04aeb892..6053aa74 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/FileServer.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/FileServer.java @@ -63,6 +63,7 @@ public class FileServer implements IncomingEvent { sslListener = ctx == null ? null : new Listener(this, ctx, 9093, Constants.TRANSFER_TIMEOUT); LOGGER.info("Max allowed concurrent uploads from clients: " + Constants.MAX_UPLOADS); LOGGER.info("Max allowed concurrent downloads from clients: " + Constants.MAX_DOWNLOADS); + LOGGER.info("Max allowed connections per transfer: " + Constants.MAX_CONNECTIONS_PER_TRANSFER); } public static FileServer instance() { @@ -137,7 +138,9 @@ public class FileServer implements IncomingEvent { it.remove(); continue; } - activeUploads += Math.max(1, upload.getActiveConnectionCount()); + if (upload.countsTowardsConnectionLimit(now)) { + activeUploads += Math.max(1, upload.getActiveConnectionCount()); + } } if (activeUploads >= Constants.MAX_UPLOADS) { throw new TTransferRejectedException("Server busy. Too many running uploads (" + activeUploads @@ -187,7 +190,9 @@ public class FileServer implements IncomingEvent { it.remove(); continue; } - activeDownloads += Math.max(1, download.getActiveConnectionCount()); + if (download.countsTowardsConnectionLimit(now)) { + activeDownloads += Math.max(1, download.getActiveConnectionCount()); + } } if (activeDownloads >= Constants.MAX_DOWNLOADS) { throw new TTransferRejectedException("Server busy. Too many running uploads (" + activeDownloads @@ -236,12 +241,12 @@ public class FileServer implements IncomingEvent { long now = System.currentTimeMillis(); int d = 0, u = 0; for (OutgoingDataTransfer t : downloads.values()) { - if (!t.isComplete(now)) { + if (t.countsTowardsConnectionLimit(now)) { d += 1; } } for (IncomingDataTransfer t : uploads.values()) { - if (!t.isComplete(now)) { + if (t.countsTowardsConnectionLimit(now)) { u += 1; } } diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/IncomingDataTransfer.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/IncomingDataTransfer.java index 4dc69c03..97c076c9 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/IncomingDataTransfer.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/IncomingDataTransfer.java @@ -45,11 +45,6 @@ public class IncomingDataTransfer extends AbstractTransfer implements HashCheckC private static final Logger LOGGER = Logger.getLogger(IncomingDataTransfer.class); /** - * How many concurrent connections per upload - */ - private static final int MAX_CONNECTIONS = Math.min(4, Math.max(Constants.MAX_UPLOADS / 4, 1)); - - /** * Self reference for inner classes. */ private final IncomingDataTransfer activeUpload = this; @@ -235,7 +230,7 @@ public class IncomingDataTransfer extends AbstractTransfer implements HashCheckC if (state == TransferState.FINISHED || state == TransferState.ERROR) return false; synchronized (downloads) { - if (downloads.size() >= MAX_CONNECTIONS) + if (downloads.size() >= Constants.MAX_CONNECTIONS_PER_TRANSFER) return false; downloads.add(connection); } @@ -261,13 +256,16 @@ public class IncomingDataTransfer extends AbstractTransfer implements HashCheckC } } }); - if (state == TransferState.IDLE) { - state = TransferState.WORKING; - } } catch (Exception e) { LOGGER.warn("threadpool rejected the incoming file transfer", e); + synchronized (downloads) { + downloads.remove(connection); + } return false; } + if (state == TransferState.IDLE) { + state = TransferState.WORKING; + } return true; } diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/OutgoingDataTransfer.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/OutgoingDataTransfer.java index b01a627f..917611c7 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/OutgoingDataTransfer.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/OutgoingDataTransfer.java @@ -14,11 +14,6 @@ public class OutgoingDataTransfer extends AbstractTransfer { private static final Logger LOGGER = Logger.getLogger(OutgoingDataTransfer.class); /** - * How many concurrent connections per download - */ - private static final int MAX_CONNECTIONS = Math.min(4, Math.max(Constants.MAX_DOWNLOADS / 4, 1)); - - /** * Remote peer is downloading, so we have Uploaders */ private List<Uploader> uploads = new ArrayList<>(); @@ -53,7 +48,7 @@ public class OutgoingDataTransfer extends AbstractTransfer { return false; potentialFinishTime.set(0); synchronized (uploads) { - if (uploads.size() > MAX_CONNECTIONS) + if (uploads.size() > Constants.MAX_CONNECTIONS_PER_TRANSFER) return false; uploads.add(connection); } @@ -74,6 +69,9 @@ public class OutgoingDataTransfer extends AbstractTransfer { }); } catch (Exception e) { LOGGER.warn("threadpool rejected the incoming file transfer", e); + synchronized (uploads) { + uploads.remove(connection); + } return false; } return true; |