From 5dc7fbc064968ffad3dc00d4dae29e3fcf098167 Mon Sep 17 00:00:00 2001 From: Nils Schwabe Date: Mon, 14 Jul 2014 15:28:43 +0200 Subject: Add that client gets error if a certain block was transmitted to many times and is still not valid --- .../serverconnection/ConnectionHandler.java | 4 +++- .../serverconnection/ImageProcessor.java | 12 +++++++--- .../serverconnection/UploadingImage.java | 27 ++++++++-------------- 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/main/java/org/openslx/imagemaster/serverconnection/ConnectionHandler.java b/src/main/java/org/openslx/imagemaster/serverconnection/ConnectionHandler.java index 6fab572..546094a 100644 --- a/src/main/java/org/openslx/imagemaster/serverconnection/ConnectionHandler.java +++ b/src/main/java/org/openslx/imagemaster/serverconnection/ConnectionHandler.java @@ -181,7 +181,9 @@ public class ConnectionHandler implements IncomingEvent return; for ( int i = startOfRange / Globals.blockSize; i < endOfRange / Globals.blockSize; i += Globals.blockSize ) { - connections.get( token ).image.setNeedsCheck( i ); + UploadingImage image = connections.get( token ).image; + image.setNeedsCheck( i ); + image.increaseTransmittedTimes( i ); } } downloader.close(); diff --git a/src/main/java/org/openslx/imagemaster/serverconnection/ImageProcessor.java b/src/main/java/org/openslx/imagemaster/serverconnection/ImageProcessor.java index 9758a2c..f7f9faa 100644 --- a/src/main/java/org/openslx/imagemaster/serverconnection/ImageProcessor.java +++ b/src/main/java/org/openslx/imagemaster/serverconnection/ImageProcessor.java @@ -109,7 +109,7 @@ public class ImageProcessor token = RandomString.generate( 100, false ); nBlocks = (int)Math.ceil( imageData.fileSize / Globals.blockSize ); allBlocks = new int[ nBlocks ]; // initalize array with all zeros which mean that this block is missing - image = new UploadingImage( token, allBlocks, new Timestamp( System.currentTimeMillis() ), uuid, filepath ); + image = new UploadingImage( token, allBlocks, System.currentTimeMillis(), uuid, filepath ); uploadingImages.put( uuid, image ); } @@ -194,8 +194,9 @@ public class ImageProcessor * @param imageUUID The image of which you want to get the missing blocks from * @param amount The amount of blocks that you want to get * @return The missing blocks + * @throws UploadException If a block was transmitted to many times. */ - private static List getNMissingBlocks( UploadingImage image, int amount ) + private static List getNMissingBlocks( UploadingImage image, int amount ) throws UploadException { int size = image.getAmountOfMissingBlocks(); if ( amount > size ) @@ -206,6 +207,11 @@ public class ImageProcessor int got = 0; for ( int i = 0; i < image.getNumberOfBlocks(); i++ ) { if ( image.needsRequest( i ) ) { + int times = image.getTimesTransmitted( i ); + if (times > 20) { // TODO: make configurable + throw new UploadException(UploadError.BROKEN_BLOCK, "Block " + i + " was transmitted " + + times + " and is still not valid."); + } result.add( i ); got++; } @@ -263,7 +269,7 @@ public class ImageProcessor for ( DbImage image : list ) { String token = image.token; ConnectionHandler.addConnection( token, image.imagePath, Connection.UPLOADING ); - UploadingImage infos = new UploadingImage( token, image.blockStatus, image.timestamp, + UploadingImage infos = new UploadingImage( token, image.blockStatus, image.timestamp.getTime(), image.uuid, image.imagePath ); CRCFile crcFile = new CRCFile( Globals.getImageDir() + "/" + image.uuid + ".crc" ); try { diff --git a/src/main/java/org/openslx/imagemaster/serverconnection/UploadingImage.java b/src/main/java/org/openslx/imagemaster/serverconnection/UploadingImage.java index 06ad5b1..dc15dae 100644 --- a/src/main/java/org/openslx/imagemaster/serverconnection/UploadingImage.java +++ b/src/main/java/org/openslx/imagemaster/serverconnection/UploadingImage.java @@ -1,7 +1,5 @@ package org.openslx.imagemaster.serverconnection; -import java.sql.Timestamp; - import org.apache.log4j.Logger; import org.openslx.imagemaster.Globals; import org.openslx.imagemaster.crcchecker.CRCFile; @@ -29,17 +27,17 @@ public class UploadingImage private int[] blockStatus = null; public static final int valid = 200; public static final int missing = 0; - private Timestamp ts; // when did the server something for the last time + private long timestamp; // when did the server something for the last time private DbImage dbImage = null; // the DB representation of this image private String uuid; private String filename; private ImageFile imageFile; private CRCFile crcFile = null; - protected UploadingImage(String token, int[] initialBlockStatus, Timestamp ts, String uuid, String filename) + protected UploadingImage(String token, int[] initialBlockStatus, long timestamp, String uuid, String filename) { this.token = token; - this.ts = ts; + this.timestamp = timestamp; this.uuid = uuid; this.blockStatus = initialBlockStatus; } @@ -79,6 +77,11 @@ public class UploadingImage blockStatus[index] += ( blockStatus[index] < missing ) ? -1 : 1; // increase in both directions } + protected int getTimesTransmitted( int index ) + { + return Math.abs( blockStatus[index] ); + } + protected String getToken() { return this.token; @@ -103,9 +106,9 @@ public class UploadingImage return blockStatus.length; } - protected Timestamp getTimestamp() + protected long getTimestamp() { - return this.ts; + return this.timestamp; } protected DbImage getDbImage() @@ -116,16 +119,6 @@ public class UploadingImage return this.dbImage; } - // protected String getFilename() - // { - // return this.filename; - // } - // - // protected String getCrcFilename() - // { - // return this.crcFilename; - // } - protected ImageFile getImageFile() { if ( imageFile == null ) { -- cgit v1.2.3-55-g7522