diff options
author | Simon Rettberg | 2016-08-30 18:02:43 +0200 |
---|---|---|
committer | Simon Rettberg | 2016-08-30 18:02:43 +0200 |
commit | f45886abed5f04728561d5c8f97423a8036806fc (patch) | |
tree | 1639d97cb76658925aaf4ddc19b080b8ea273e53 /src/main/java/org/openslx/imagemaster/serverconnection/IncomingTransfer.java | |
parent | (WiP) Global image sync (diff) | |
download | masterserver-f45886abed5f04728561d5c8f97423a8036806fc.tar.gz masterserver-f45886abed5f04728561d5c8f97423a8036806fc.tar.xz masterserver-f45886abed5f04728561d5c8f97423a8036806fc.zip |
Implement global image exchange with satellite servers
Diffstat (limited to 'src/main/java/org/openslx/imagemaster/serverconnection/IncomingTransfer.java')
-rw-r--r-- | src/main/java/org/openslx/imagemaster/serverconnection/IncomingTransfer.java | 45 |
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; + } + } |