summaryrefslogtreecommitdiffstats
path: root/dozentenmodulserver/src/main/java
diff options
context:
space:
mode:
authorSimon Rettberg2015-10-02 14:53:15 +0200
committerSimon Rettberg2015-10-02 14:53:15 +0200
commit696a5b00857b1891e1db61198f4437934d03cb85 (patch)
treec7391001bf7788ef3a51c24c294795b805ede0dc /dozentenmodulserver/src/main/java
parent[client] Start upload only when finishing wizard, add final summary page to w... (diff)
downloadtutor-module-696a5b00857b1891e1db61198f4437934d03cb85.tar.gz
tutor-module-696a5b00857b1891e1db61198f4437934d03cb85.tar.xz
tutor-module-696a5b00857b1891e1db61198f4437934d03cb85.zip
[server] Tweaks/fixes to file transfers
Diffstat (limited to 'dozentenmodulserver/src/main/java')
-rw-r--r--dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/AbstractTransfer.java2
-rw-r--r--dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/FileServer.java12
-rw-r--r--dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/IncomingDataTransfer.java47
-rw-r--r--dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/thrift/ServerHandler.java4
4 files changed, 50 insertions, 15 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 f164e5a6..2f49b06e 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
@@ -21,7 +21,7 @@ public abstract class AbstractTransfer {
* 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);
+ private static final long HOT_IDLE_TIMEOUT = TimeUnit.MINUTES.toMillis(10);
/**
* 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
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 6053aa74..a8023989 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
@@ -139,7 +139,7 @@ public class FileServer implements IncomingEvent {
continue;
}
if (upload.countsTowardsConnectionLimit(now)) {
- activeUploads += Math.max(1, upload.getActiveConnectionCount());
+ activeUploads += 1;
}
}
if (activeUploads >= Constants.MAX_UPLOADS) {
@@ -191,7 +191,7 @@ public class FileServer implements IncomingEvent {
continue;
}
if (download.countsTowardsConnectionLimit(now)) {
- activeDownloads += Math.max(1, download.getActiveConnectionCount());
+ activeDownloads += 1;
}
}
if (activeDownloads >= Constants.MAX_DOWNLOADS) {
@@ -217,9 +217,11 @@ public class FileServer implements IncomingEvent {
errorMessage = "File corrupted on server";
}
if (errorMessage != null) {
- try {
- DbImage.markValid(false, true, localImageData);
- } catch (SQLException e) {
+ if (localImageData.isValid) {
+ try {
+ DbImage.markValid(false, true, localImageData);
+ } catch (SQLException e) {
+ }
}
throw new TTransferRejectedException(errorMessage);
}
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 97c076c9..abdb0e39 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
@@ -105,6 +105,8 @@ public class IncomingDataTransfer extends AbstractTransfer implements HashCheckC
private static final HashChecker hashChecker;
+ private static final long MIN_FREE_SPACE_BYTES = 64l * 1024l * 1024l;
+
static {
HashChecker hc;
try {
@@ -238,7 +240,7 @@ public class IncomingDataTransfer extends AbstractTransfer implements HashCheckC
pool.execute(new Runnable() {
@Override
public void run() {
- CbHandler cbh = new CbHandler();
+ CbHandler cbh = new CbHandler(connection);
if (!connection.download(cbh, cbh)) {
if (cbh.currentChunk != null) {
// If the download failed and we have a current chunk, put it back into
@@ -247,7 +249,9 @@ public class IncomingDataTransfer extends AbstractTransfer implements HashCheckC
}
LOGGER.warn("Download of " + tmpFileName.getAbsolutePath() + " failed");
}
- lastActivityTime.set(System.currentTimeMillis());
+ if (state != TransferState.FINISHED && state != TransferState.ERROR) {
+ lastActivityTime.set(System.currentTimeMillis());
+ }
synchronized (downloads) {
downloads.remove(connection);
}
@@ -279,9 +283,9 @@ public class IncomingDataTransfer extends AbstractTransfer implements HashCheckC
* @return
*/
private void writeFileData(long fileOffset, int dataLength, byte[] data) {
- if (state != TransferState.WORKING)
- throw new IllegalStateException("Cannot write to file if state != RUNNING");
synchronized (tmpFileHandle) {
+ if (state != TransferState.WORKING)
+ throw new IllegalStateException("Cannot write to file if state != WORKING");
try {
tmpFileHandle.seek(fileOffset);
tmpFileHandle.write(data, 0, dataLength);
@@ -289,9 +293,11 @@ public class IncomingDataTransfer extends AbstractTransfer implements HashCheckC
LOGGER.error("Cannot write to '" + tmpFileName
+ "'. Disk full, network storage error, bad permissions, ...?", e);
fileWritable = false;
- state = TransferState.ERROR;
}
}
+ if (!fileWritable) {
+ cancel();
+ }
}
/**
@@ -357,7 +363,7 @@ public class IncomingDataTransfer extends AbstractTransfer implements HashCheckC
} catch (SQLException e) {
LOGGER.error("Error finishing upload: Inserting version to DB failed", e);
state = TransferState.ERROR;
- // Also delete uploaded file, as there is no refence to it
+ // Also delete uploaded file, as there is no reference to it
FileSystem.deleteAsync(destination);
cancel();
return;
@@ -366,7 +372,7 @@ public class IncomingDataTransfer extends AbstractTransfer implements HashCheckC
@Override
public synchronized void cancel() {
- if (state != TransferState.FINISHED) {
+ if (state != TransferState.FINISHED && state != TransferState.ERROR) {
state = TransferState.ERROR;
if (!isRepairUpload() && tmpFileName.exists()) {
FileSystem.deleteAsync(tmpFileName);
@@ -410,7 +416,18 @@ public class IncomingDataTransfer extends AbstractTransfer implements HashCheckC
* The current chunk being transfered.
*/
private FileChunk currentChunk = null;
+ /**
+ * Current buffer to receive to
+ */
private byte[] buffer = new byte[FileChunk.CHUNK_SIZE];
+ /**
+ * Downloader object
+ */
+ private final Downloader downloader;
+
+ private CbHandler(Downloader downloader) {
+ this.downloader = downloader;
+ }
@Override
public boolean dataReceived(long fileOffset, int dataLength, byte[] data) {
@@ -447,7 +464,12 @@ public class IncomingDataTransfer extends AbstractTransfer implements HashCheckC
return null;
}
// Might raise OOM again, but THIS TIME I MEAN IT
- buffer = new byte[buffer.length];
+ try {
+ buffer = new byte[buffer.length];
+ } catch (OutOfMemoryError e2) {
+ downloader.sendErrorCode("Out of RAM");
+ cancel();
+ }
}
} else {
writeFileData(currentChunk.range.startOffset, currentChunk.range.getLength(), buffer);
@@ -459,11 +481,18 @@ public class IncomingDataTransfer extends AbstractTransfer implements HashCheckC
currentChunk = chunks.getMissing();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
+ cancel();
return null;
}
if (currentChunk == null) {
return null; // No more chunks, returning null tells the Downloader we're done.
}
+ // Check remaining disk space and abort if it's too low
+ if (FileSystem.getAvailableStorageBytes() < MIN_FREE_SPACE_BYTES) {
+ downloader.sendErrorCode("Out of disk space");
+ cancel();
+ return null;
+ }
return currentChunk.range;
}
}
@@ -474,6 +503,8 @@ public class IncomingDataTransfer extends AbstractTransfer implements HashCheckC
@Override
public void hashCheckDone(HashResult result, byte[] data, FileChunk chunk) {
+ if (state != TransferState.IDLE && state != TransferState.WORKING)
+ return;
switch (result) {
case FAILURE:
LOGGER.warn("Hash check of chunk " + chunk.toString()
diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/thrift/ServerHandler.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/thrift/ServerHandler.java
index ee244eaa..ce74680d 100644
--- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/thrift/ServerHandler.java
+++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/thrift/ServerHandler.java
@@ -123,8 +123,10 @@ public class ServerHandler implements SatelliteServer.Iface {
@Override
public void cancelUpload(String uploadToken) {
IncomingDataTransfer upload = fileServer.getUploadByToken(uploadToken);
- if (upload != null)
+ if (upload != null) {
+ LOGGER.debug("User cancelled upload " + uploadToken);
upload.cancel();
+ }
}