diff options
Diffstat (limited to 'dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv')
-rw-r--r-- | dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/IncomingDataTransfer.java | 62 |
1 files changed, 56 insertions, 6 deletions
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 d5dd5a14..aa3047af 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 @@ -9,10 +9,12 @@ import java.util.List; import java.util.UUID; import java.util.concurrent.ExecutorService; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import javax.net.ssl.SSLContext; import org.apache.log4j.Logger; +import org.openslx.bwlp.sat.RuntimeConfig; import org.openslx.bwlp.sat.database.mappers.DbImage; import org.openslx.bwlp.sat.database.mappers.DbImageBlock; import org.openslx.bwlp.sat.database.mappers.DbLog; @@ -23,6 +25,7 @@ import org.openslx.bwlp.sat.util.Formatter; import org.openslx.bwlp.thrift.iface.ImageDetailsRead; import org.openslx.bwlp.thrift.iface.ImagePublishData; import org.openslx.bwlp.thrift.iface.ImageVersionWrite; +import org.openslx.bwlp.thrift.iface.SscMode; import org.openslx.bwlp.thrift.iface.TNotFoundException; import org.openslx.bwlp.thrift.iface.TransferInformation; import org.openslx.bwlp.thrift.iface.TransferState; @@ -88,7 +91,7 @@ public class IncomingDataTransfer extends IncomingTransferBase { this.image = image; this.machineDescription = machineDescription; this.masterTransferInfo = null; - initRepairUpload(); + initCommonUpload(); } public IncomingDataTransfer(ImagePublishData publishData, File tmpFile, TransferInformation transferInfo, @@ -113,10 +116,17 @@ public class IncomingDataTransfer extends IncomingTransferBase { this.machineDescription = ThriftUtil.unwrapByteBuffer(transferInfo.machineDescription); this.masterTransferInfo = transferInfo; this.versionSettings = new ImageVersionWrite(false); - initRepairUpload(); + initCommonUpload(); } - private void initRepairUpload() { + private void initCommonUpload() { + SscMode sscMode = RuntimeConfig.get().serverSideCopy; + if (sscMode == SscMode.OFF) { + super.enableServerSideCopying(false); + } else if (sscMode == SscMode.ON) { + super.enableServerSideCopying(true); + } + // Handle repair upload... if (!isRepairUpload()) return; if (getTmpFileName().exists() && getTmpFileName().length() > 0) { @@ -372,9 +382,46 @@ public class IncomingDataTransfer extends IncomingTransferBase { } } } + + // Measure speed for automatic server-side copy + private final AtomicInteger speedCounter = new AtomicInteger(); + private long speedTimestamp = 0; + private static final long SSC_ENABLE_THRES = 10l * 1024 * 1024; + private static final long SSC_DISABLE_THRES = 20l * 1024 * 1024; @Override protected boolean chunkReceived(FileChunk chunk, byte[] data) { + SscMode sscMode = RuntimeConfig.get().serverSideCopy; + if (sscMode == SscMode.AUTO) { + // Automatic SSC setting + long diff = 0; + long bytes; + synchronized (speedCounter) { + bytes = speedCounter.addAndGet(chunk.range.getLength()); + if (bytes >= FileChunk.CHUNK_SIZE * 3) { + diff = System.currentTimeMillis() - speedTimestamp; + speedTimestamp = System.currentTimeMillis(); + } + } + if (diff != 0 && diff < 100000000) { + // Time to evaluate the situation + long speed = bytes / (diff / 1000); + if (speed < SSC_ENABLE_THRES) { + super.enableServerSideCopying(true); + } else if (speed > SSC_DISABLE_THRES) { + super.enableServerSideCopying(false); + } + } + + } else { + speedTimestamp = 0; + if (sscMode == SscMode.OFF) { + super.enableServerSideCopying(false); + } else if (sscMode == SscMode.ON) { + super.enableServerSideCopying(true); + } + } + // Hashing if (getHashChecker() == null) return false; try { @@ -394,9 +441,12 @@ public class IncomingDataTransfer extends IncomingTransferBase { * Alter options of this upload. Returns new effective options. */ public UploadOptions setOptions(UploadOptions options) { - if (options != null) { - if (options.isSetServerSideCopying()) { - super.enableServerSideCopying(options.serverSideCopying); + if (RuntimeConfig.get().serverSideCopy == SscMode.USER) { + // User can fiddle around + if (options != null) { + if (options.isSetServerSideCopying()) { + super.enableServerSideCopying(options.serverSideCopying); + } } } return new UploadOptions(super.isServerSideCopyingEnabled()); |