summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/openslx/imagemaster/serverconnection/IncomingTransfer.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/openslx/imagemaster/serverconnection/IncomingTransfer.java')
-rw-r--r--src/main/java/org/openslx/imagemaster/serverconnection/IncomingTransfer.java45
1 files changed, 41 insertions, 4 deletions
diff --git a/src/main/java/org/openslx/imagemaster/serverconnection/IncomingTransfer.java b/src/main/java/org/openslx/imagemaster/serverconnection/IncomingTransfer.java
index bfc65e1..53842be 100644
--- a/src/main/java/org/openslx/imagemaster/serverconnection/IncomingTransfer.java
+++ b/src/main/java/org/openslx/imagemaster/serverconnection/IncomingTransfer.java
@@ -3,9 +3,11 @@ package org.openslx.imagemaster.serverconnection;
import java.io.File;
import java.io.FileNotFoundException;
import java.nio.ByteBuffer;
+import java.sql.SQLException;
import java.util.List;
import java.util.UUID;
+import org.apache.log4j.Logger;
import org.openslx.bwlp.thrift.iface.ImagePublishData;
import org.openslx.bwlp.thrift.iface.TInvocationException;
import org.openslx.bwlp.thrift.iface.TransferInformation;
@@ -13,6 +15,7 @@ import org.openslx.filetransfer.util.ChunkStatus;
import org.openslx.filetransfer.util.FileChunk;
import org.openslx.filetransfer.util.IncomingTransferBase;
import org.openslx.imagemaster.Globals;
+import org.openslx.imagemaster.db.mappers.DbImage;
import org.openslx.imagemaster.db.mappers.DbImageBlock;
import org.openslx.imagemaster.util.Util;
import org.openslx.util.ThriftUtil;
@@ -20,16 +23,33 @@ import org.openslx.util.ThriftUtil;
public class IncomingTransfer extends IncomingTransferBase
{
+ private static final Logger LOGGER = Logger.getLogger( IncomingTransfer.class );
+
private static final long MIN_FREE_SPACE_BYTES = FileChunk.CHUNK_SIZE * 10;
private final String imageVersionId;
- public IncomingTransfer( ImagePublishData img, List<ByteBuffer> blockHashes )
+ private final TransferInformation transferInfo;
+
+ public IncomingTransfer( ImagePublishData img, List<ByteBuffer> blockHashes, File absDestination, int plainPort, int sslPort )
throws TInvocationException, FileNotFoundException
{
- super( UUID.randomUUID().toString(), new File( new File( Globals.getImageDir(), img.imageBaseId ), img.imageVersionId ),
- img.fileSize, ThriftUtil.unwrapByteBufferList( blockHashes ) );
+ super( UUID.randomUUID().toString(), absDestination, img.fileSize, ThriftUtil.unwrapByteBufferList( blockHashes ) );
this.imageVersionId = img.imageVersionId;
+ this.transferInfo = new TransferInformation( getId(), plainPort, sslPort );
+ // If the file already exists, see if any chunks are already complete
+ if ( absDestination.exists() && absDestination.length() > 0 ) {
+ try {
+ List<Boolean> statusList = DbImageBlock.getMissingStatusList( img.imageVersionId );
+ if ( !statusList.isEmpty() ) {
+ getChunks().resumeFromStatusList( statusList, absDestination.length() );
+ for ( int i = 0; i < 3; ++i ) {
+ queueUnhashedChunk( false );
+ }
+ }
+ } catch ( SQLException e ) {
+ }
+ }
}
@Override
@@ -56,18 +76,30 @@ public class IncomingTransfer extends IncomingTransferBase
protected boolean finishIncomingTransfer()
{
potentialFinishTime.set( System.currentTimeMillis() );
+ try {
+ DbImage.markValid( this.imageVersionId, true );
+ } catch ( SQLException e ) {
+ // Nothing to do
+ }
return true;
}
@Override
public TransferInformation getTransferInfo()
{
- return new TransferInformation( getId(), Globals.getFiletransferPortPlain(), Globals.getFiletransferPortSsl() );
+ return transferInfo;
}
@Override
protected void chunkStatusChanged( FileChunk chunk )
{
+ if ( chunk.getFailCount() > 6 ) {
+ cancel();
+ LOGGER.warn( "Server is cancelling upload of Version " + imageVersionId
+ + ": Hash check for block " + chunk.getChunkIndex()
+ + " failed " + chunk.getFailCount()
+ + " times." );
+ }
ChunkStatus status = chunk.getStatus();
if ( status == ChunkStatus.MISSING || status == ChunkStatus.COMPLETE ) {
try {
@@ -78,4 +110,9 @@ public class IncomingTransfer extends IncomingTransferBase
}
}
+ public Object getImageVersionId()
+ {
+ return imageVersionId;
+ }
+
}