diff options
author | Simon Rettberg | 2016-04-20 17:10:42 +0200 |
---|---|---|
committer | Simon Rettberg | 2016-04-20 17:10:42 +0200 |
commit | f73acba9666cbd61d1caa126103eef0f53bc5ac7 (patch) | |
tree | 77588f0ef1b0824392aa487af79c368a2e4ea103 | |
parent | [*] Display sat->master progress in client (diff) | |
download | tutor-module-f73acba9666cbd61d1caa126103eef0f53bc5ac7.tar.gz tutor-module-f73acba9666cbd61d1caa126103eef0f53bc5ac7.tar.xz tutor-module-f73acba9666cbd61d1caa126103eef0f53bc5ac7.zip |
More imgsync stuff
4 files changed, 29 insertions, 84 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/DownloadTask.java b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/DownloadTask.java index 0aa48e8c..346928de 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/DownloadTask.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/DownloadTask.java @@ -108,7 +108,7 @@ public class DownloadTask extends TransferTask { fileHandle.seek(chunk.range.startOffset); fileHandle.write(buffer, 0, chunk.range.getLength()); } - chunks.markSuccessful(chunk); + chunks.markCompleted(chunk, true); } catch (Exception e) { LOGGER.error("Could not write to file at offset " + chunk.range.startOffset, e); fileWritable = false; @@ -182,16 +182,16 @@ public class DownloadTask extends TransferTask { } } // 0 = complete, 1 = missing, 2 = uploading, 3 = queued for copying, 4 = copying - if (progress != null) { - int missing = 0; - for (byte b : progress) { - if (b != 0) { - missing++; - } - } - final long bytesRemaining = CHUNK_SIZE * (long) missing; - timeRemaining = (1000 * bytesRemaining) / (speed + 1); + if (progress != null) { + int missing = 0; + for (byte b : progress) { + if (b != 0) { + missing++; } + } + final long bytesRemaining = CHUNK_SIZE * (long) missing; + timeRemaining = (1000 * bytesRemaining) / (speed + 1); + } return new TransferEvent(state, progress, speed, timeRemaining, error); } diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/FileServer.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/FileServer.java index a4e8de3c..8c00ad60 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/FileServer.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/FileServer.java @@ -231,7 +231,7 @@ public class FileServer implements IncomingEvent { throw new TTransferRejectedException(errorMessage); } String key = UUID.randomUUID().toString(); - OutgoingDataTransfer transfer = new OutgoingDataTransfer(key, srcFile); + OutgoingDataTransfer transfer = new OutgoingDataTransfer(key, srcFile, getPlainPort(), getSslPort()); downloads.put(key, transfer); return transfer; } diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/OutgoingDataTransfer.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/OutgoingDataTransfer.java index e2276908..d87cdb9e 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/OutgoingDataTransfer.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/OutgoingDataTransfer.java @@ -10,11 +10,11 @@ import java.util.concurrent.ExecutorService; import org.apache.log4j.Logger; import org.openslx.bwlp.sat.util.Configuration; -import org.openslx.bwlp.sat.util.Constants; import org.openslx.bwlp.thrift.iface.TransferInformation; import org.openslx.filetransfer.Uploader; +import org.openslx.filetransfer.util.OutgoingTransferBase; -public class OutgoingDataTransfer extends AbstractTransfer { +public class OutgoingDataTransfer extends OutgoingTransferBase { private static final Logger LOGGER = Logger.getLogger(OutgoingDataTransfer.class); @@ -23,21 +23,16 @@ public class OutgoingDataTransfer extends AbstractTransfer { */ private List<Uploader> uploads = new ArrayList<>(); - private final File sourceFile; - private final TransferInformation masterTransferInfo; - private boolean isCanceled = false; - /** * For downloads by clients. * * @param uuid UUID of this transfer * @param file file to send to client */ - public OutgoingDataTransfer(String uuid, File file) { - super(uuid); - this.sourceFile = file; + public OutgoingDataTransfer(String uuid, File file, int plainPort, int sslPort) { + super(uuid, file, plainPort, sslPort); this.masterTransferInfo = null; } @@ -49,9 +44,8 @@ public class OutgoingDataTransfer extends AbstractTransfer { * @param absFile file to send to master server */ public OutgoingDataTransfer(TransferInformation transferInfo, File absFile) { - super(transferInfo.token); + super(transferInfo.token, absFile, 0, 0); this.masterTransferInfo = transferInfo; - this.sourceFile = absFile; } /** @@ -59,7 +53,7 @@ public class OutgoingDataTransfer extends AbstractTransfer { * can make sure the transfer is running. */ public synchronized void heartBeat(ExecutorService pool) { - if (isCanceled || masterTransferInfo == null) + if (masterTransferInfo == null) return; synchronized (uploads) { if (uploads.size() >= 1) @@ -96,68 +90,10 @@ public class OutgoingDataTransfer extends AbstractTransfer { } } - /** - * Add another connection for this file transfer. - * - * @param connection - * @return true if the connection is accepted, false if it should be - * discarded - */ - public synchronized boolean addConnection(final Uploader connection, ExecutorService pool) { - if (isCanceled || masterTransferInfo != null) - return false; - potentialFinishTime.set(0); - synchronized (uploads) { - if (uploads.size() > Constants.MAX_CONNECTIONS_PER_TRANSFER) - return false; - uploads.add(connection); - } - return runConnectionInternal(connection, pool); - } - - private boolean runConnectionInternal(final Uploader connection, ExecutorService pool) { - try { - pool.execute(new Runnable() { - @Override - public void run() { - boolean ret = connection.upload(sourceFile.getAbsolutePath()); - synchronized (uploads) { - uploads.remove(connection); - } - if (ret && uploads.isEmpty() && potentialFinishTime.get() == 0) { - potentialFinishTime.set(System.currentTimeMillis()); - } - lastActivityTime.set(System.currentTimeMillis()); - } - }); - } catch (Exception e) { - LOGGER.warn("threadpool rejected the incoming file transfer", e); - synchronized (uploads) { - uploads.remove(connection); - } - return false; - } - return true; - } - - @Override - public synchronized void cancel() { - isCanceled = true; - synchronized (uploads) { - for (Uploader u : uploads) { - u.cancel(); - } - } - } - - @Override - public boolean isActive() { - return !isCanceled; - } - @Override - public int getActiveConnectionCount() { - return uploads.size(); + public String getRelativePath() { + // TODO Auto-generated method stub + return null; } } diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/SyncTransferHandler.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/SyncTransferHandler.java index 36faa4bc..cd46a1c5 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/SyncTransferHandler.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/SyncTransferHandler.java @@ -17,6 +17,7 @@ import org.apache.log4j.Logger; import org.apache.thrift.TException; import org.openslx.bwlp.sat.database.mappers.DbImage; import org.openslx.bwlp.sat.database.mappers.DbUser; +import org.openslx.bwlp.sat.database.models.ImageVersionMeta; import org.openslx.bwlp.sat.database.models.LocalImageVersion; import org.openslx.bwlp.sat.util.Constants; import org.openslx.bwlp.sat.util.FileSystem; @@ -114,15 +115,22 @@ public class SyncTransferHandler { if (!absFile.isFile() || !absFile.canRead()) { LOGGER.error("Cannot upload " + imgVersion.imageVersionId + ": file missing: " + absFile.getAbsolutePath()); + DbImage.markValid(false, true, imgVersion); throw new TInvocationException(InvocationError.INTERNAL_SERVER_ERROR, "Source file not readable"); } if (absFile.length() != imgVersion.fileSize) { LOGGER.error("Cannot upload" + imgVersion.imageVersionId + ": wrong file size - expected " + imgVersion.fileSize + ", got " + absFile.length()); + DbImage.markValid(false, true, imgVersion); throw new TInvocationException(InvocationError.INTERNAL_SERVER_ERROR, "File corrupted on satellite server"); } checkUploadCount(); + ImageVersionMeta versionDetails = DbImage.getVersionDetails(imgVersion.imageVersionId); + if (versionDetails == null || versionDetails.machineDescription == null + || versionDetails.machineDescription.length == 0) + throw new TInvocationException(InvocationError.MISSING_DATA, + "Given virtual machine has no hardware description"); ImageDetailsRead details = DbImage.getImageDetails(null, imgVersion.imageBaseId); List<ByteBuffer> blockHashes = DbImage.getBlockHashes(imgVersion.imageVersionId); ImagePublishData publishData = new ImagePublishData(); @@ -137,6 +145,7 @@ public class SyncTransferHandler { publishData.uploader = DbUser.getOrNull(imgVersion.uploaderId); publishData.owner = DbUser.getOrNull(imgBase.ownerId); publishData.virtId = details.virtId; + publishData.machineDescription = ByteBuffer.wrap(versionDetails.machineDescription); try { transferInfo = ThriftManager.getMasterClient().submitImage(userToken, publishData, blockHashes); } catch (TAuthorizationException e) { |