summaryrefslogtreecommitdiffstats
path: root/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/IncomingDataTransfer.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/org/openslx/bwlp/sat/fileserv/IncomingDataTransfer.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/org/openslx/bwlp/sat/fileserv/IncomingDataTransfer.java')
-rw-r--r--dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/IncomingDataTransfer.java47
1 files changed, 39 insertions, 8 deletions
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()