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 | |
| 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')
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(); + } } |
