diff options
author | Simon Rettberg | 2015-10-02 14:53:15 +0200 |
---|---|---|
committer | Simon Rettberg | 2015-10-02 14:53:15 +0200 |
commit | 696a5b00857b1891e1db61198f4437934d03cb85 (patch) | |
tree | c7391001bf7788ef3a51c24c294795b805ede0dc /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) | |
download | tutor-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.java | 47 |
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() |