diff options
Diffstat (limited to 'dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/SyncTransferHandler.java')
-rw-r--r-- | dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/fileserv/SyncTransferHandler.java | 30 |
1 files changed, 26 insertions, 4 deletions
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 e868ceaa..cf3bddf2 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 @@ -49,7 +49,7 @@ public class SyncTransferHandler { Thread.NORM_PRIORITY - 3)); /** - * All currently running downloads from master, indexed by token + * All currently running downloads from master, indexed by token, which is == versionId */ private static final Map<String, IncomingDataTransfer> downloads = new ConcurrentHashMap<>(); @@ -105,7 +105,7 @@ public class SyncTransferHandler { }; @Override - public void fire() { + public synchronized void fire() { if (uploadsByTransferId.isEmpty() && uploadsByVersionId.isEmpty() && downloads.isEmpty()) return; // Nothing to do anyways, don't wake up another thread if (transferPool.getMaximumPoolSize() - transferPool.getActiveCount() < 2 && ++skips < 10) @@ -182,12 +182,12 @@ public class SyncTransferHandler { throw new TInvocationException(InvocationError.INTERNAL_SERVER_ERROR, "Communication with master server failed"); } - OutgoingDataTransfer transfer = new OutgoingDataTransfer(transferInfo, absFile); + OutgoingDataTransfer transfer = new OutgoingDataTransfer(transferInfo, absFile, imgVersion.imageVersionId); uploadsByVersionId.put(imgVersion.imageVersionId, transfer); uploadsByTransferId.put(transfer.getId(), transfer); - transfer.heartBeat(transferPool); LOGGER.info("Client wants to upload image " + imgVersion.imageVersionId + ", created transfer " + transfer.getId()); + heartBeatTask.fire(); return transfer.getId(); } @@ -239,6 +239,7 @@ public class SyncTransferHandler { IncomingDataTransfer transfer = new IncomingDataTransfer(image, tmpFile, transferInfo, localImageData != null); downloads.put(transfer.getId(), transfer); + heartBeatTask.fire(); return transfer.getId(); } catch (FileNotFoundException e) { LOGGER.warn("Could not open " + tmpFile.getAbsolutePath()); @@ -308,5 +309,26 @@ public class SyncTransferHandler { return null; return downloads.get(downloadToken); } + + /** + * Check whether the given imageVersionId refers to an active transfer. + */ + public static boolean isActiveTransfer(String baseId, String versionId) { + if (versionId != null) { + OutgoingDataTransfer odt = uploadsByVersionId.get(versionId); + if (odt != null && !odt.isComplete(System.currentTimeMillis()) && odt.isActive()) + return true; + } + long now = System.currentTimeMillis(); + for (IncomingDataTransfer idt : downloads.values()) { + if (idt.isComplete(now) || !idt.isActive()) + continue; + if (versionId != null && versionId.equals(idt.getVersionId())) + return true; + if (baseId != null && baseId.equals(idt.getBaseId())) + return true; + } + return false; + } } |