summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Rettberg2015-09-30 13:45:10 +0200
committerSimon Rettberg2015-09-30 13:45:10 +0200
commit2e7c0179cf83bda3a26589d7b6c3c852adf4df41 (patch)
treec5feee4daf97c55c18bbca4d8dd6e43c5638b2fa
parent[client] Added "Show linking lectures" button im imageDetailsW. (diff)
downloadtutor-module-2e7c0179cf83bda3a26589d7b6c3c852adf4df41.tar.gz
tutor-module-2e7c0179cf83bda3a26589d7b6c3c852adf4df41.tar.xz
tutor-module-2e7c0179cf83bda3a26589d7b6c3c852adf4df41.zip
[server] Fix transfer timeout detection and active counting
-rw-r--r--dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/AbstractTransfer.java11
-rw-r--r--dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/FileServer.java13
-rw-r--r--dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/IncomingDataTransfer.java16
-rw-r--r--dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/OutgoingDataTransfer.java10
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;