summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Rettberg2016-07-20 15:55:41 +0200
committerSimon Rettberg2016-07-20 15:55:41 +0200
commit7f675da53688bd95b65a0e0ec53188aabf8462c6 (patch)
tree7dc0670a64eddfa8ac937b4ed47e79d7eaed0a8b
parent[server] Add log table; add log messages to relevant actions and events (diff)
downloadtutor-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.java3
-rw-r--r--dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/IncomingDataTransfer.java34
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;
+ }
+
}