summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNils Schwabe2014-07-14 15:28:43 +0200
committerNils Schwabe2014-07-14 15:28:43 +0200
commit5dc7fbc064968ffad3dc00d4dae29e3fcf098167 (patch)
tree32860e3613eb8812b912730ac0de60a5d9ea53a0
parentAdd feature to hold crc sums in RAM when writing to disk fails (diff)
downloadmasterserver-5dc7fbc064968ffad3dc00d4dae29e3fcf098167.tar.gz
masterserver-5dc7fbc064968ffad3dc00d4dae29e3fcf098167.tar.xz
masterserver-5dc7fbc064968ffad3dc00d4dae29e3fcf098167.zip
Add that client gets error if a certain block was transmitted to many times and is still not valid
-rw-r--r--src/main/java/org/openslx/imagemaster/serverconnection/ConnectionHandler.java4
-rw-r--r--src/main/java/org/openslx/imagemaster/serverconnection/ImageProcessor.java12
-rw-r--r--src/main/java/org/openslx/imagemaster/serverconnection/UploadingImage.java27
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<Integer> getNMissingBlocks( UploadingImage image, int amount )
+ private static List<Integer> 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 ) {