diff options
author | Simon Rettberg | 2016-07-20 15:55:41 +0200 |
---|---|---|
committer | Simon Rettberg | 2016-07-20 15:55:41 +0200 |
commit | 7f675da53688bd95b65a0e0ec53188aabf8462c6 (patch) | |
tree | 7dc0670a64eddfa8ac937b4ed47e79d7eaed0a8b | |
parent | [server] Add log table; add log messages to relevant actions and events (diff) | |
download | tutor-module-7f675da53688bd95b65a0e0ec53188aabf8462c6.tar.gz tutor-module-7f675da53688bd95b65a0e0ec53188aabf8462c6.tar.xz tutor-module-7f675da53688bd95b65a0e0ec53188aabf8462c6.zip |
[server] Cancel incoming transfer if a block failed more than 3 times
-rw-r--r-- | dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/FileServer.java | 3 | ||||
-rw-r--r-- | dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/IncomingDataTransfer.java | 34 |
2 files changed, 30 insertions, 7 deletions
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 549bfaec..61b78900 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 @@ -104,6 +104,9 @@ public class FileServer implements IncomingEvent { return; } if (!upload.addConnection(downloader, transferPool)) { + if (upload.getErrorMessage() != null) { + downloader.sendErrorCode(upload.getErrorMessage()); + } downloader.cancel(); } } 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 8bda7cab..b330ed15 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 @@ -14,6 +14,7 @@ import javax.net.ssl.SSLContext; import org.apache.log4j.Logger; import org.openslx.bwlp.sat.database.mappers.DbImage; import org.openslx.bwlp.sat.database.mappers.DbImageBlock; +import org.openslx.bwlp.sat.database.mappers.DbLog; import org.openslx.bwlp.sat.util.Configuration; import org.openslx.bwlp.sat.util.Constants; import org.openslx.bwlp.sat.util.FileSystem; @@ -70,6 +71,12 @@ public class IncomingDataTransfer extends IncomingTransferBase { */ private final TransferInformation masterTransferInfo; + /** + * Optional error message to send to client when rejecting incoming + * connection + */ + private String errorMessage = null; + public IncomingDataTransfer(String uploadId, UserInfo owner, ImageDetailsRead image, File destinationFile, long fileSize, List<byte[]> sha1Sums, byte[] machineDescription, boolean repairUpload) throws FileNotFoundException { @@ -324,15 +331,28 @@ public class IncomingDataTransfer extends IncomingTransferBase { @Override protected void chunkStatusChanged(FileChunk chunk) { - if (!isRepairUpload()) - return; - ChunkStatus status = chunk.getStatus(); - if (status == ChunkStatus.MISSING || status == ChunkStatus.COMPLETE) { - try { - DbImageBlock.asyncUpdate(getVersionId(), chunk); - } catch (InterruptedException e) { + if (chunk.getFailCount() > 3) { + cancel(); + errorMessage = "Uploaded file is corrupted - did you modify the VM while uploading?"; + DbLog.log(owner, image.imageBaseId, "Server is cancelling upload of Version " + getVersionId() + + " for '" + image.imageName + "': Hash check for block " + chunk.getChunkIndex() + + " failed " + chunk.getFailCount() + + " times. Maybe the user was still running the VM when starting the upload."); + } + if (isRepairUpload()) { + // Repair uploads write to the database while making progress + ChunkStatus status = chunk.getStatus(); + if (status == ChunkStatus.MISSING || status == ChunkStatus.COMPLETE) { + try { + DbImageBlock.asyncUpdate(getVersionId(), chunk); + } catch (InterruptedException e) { + } } } } + public String getErrorMessage() { + return errorMessage; + } + } |