diff --git a/core/src/main/groovy/com/muwire/core/download/DownloadSession.groovy b/core/src/main/groovy/com/muwire/core/download/DownloadSession.groovy index fc4c995b..34042424 100644 --- a/core/src/main/groovy/com/muwire/core/download/DownloadSession.groovy +++ b/core/src/main/groovy/com/muwire/core/download/DownloadSession.groovy @@ -44,7 +44,7 @@ class DownloadSession { private MappedByteBuffer mapped private boolean unclaim = true private boolean steal - private int piece, position + int piece, position private long pieceStart, start, end DownloadSession(EventBus eventBus, String meB64, Pieces pieces, InfoHash infoHash, Endpoint endpoint, File file, diff --git a/core/src/main/groovy/com/muwire/core/download/Downloader.groovy b/core/src/main/groovy/com/muwire/core/download/Downloader.groovy index 97f5569c..16246f17 100644 --- a/core/src/main/groovy/com/muwire/core/download/Downloader.groovy +++ b/core/src/main/groovy/com/muwire/core/download/Downloader.groovy @@ -405,15 +405,18 @@ public class Downloader { boolean feed = downloadManager.muSettings.fileFeed && downloadManager.muSettings.advertiseFeed boolean chat = chatServer.isRunning() && downloadManager.muSettings.advertiseChat + Set queuedPieces = new HashSet<>() boolean requestPerformed while(!pieces.isComplete()) { if (sessionQueue.isEmpty()) { boolean sentAnyRequests = false queueSize.times { + available.removeAll(queuedPieces) def currentSession = new DownloadSession(eventBus, me.toBase64(), pieces, getInfoHash(), endpoint, incompleteFile, pieceSize, length, available, dataSinceLastRead, browse, feed, chat) if (currentSession.sendRequest()) { + queuedPieces.add(currentSession.piece) sessionQueue.addLast(currentSession) sentAnyRequests = true } @@ -422,13 +425,18 @@ public class Downloader { break; endpoint.getOutputStream().flush() } + available.removeAll(queuedPieces) def nextSession = new DownloadSession(eventBus, me.toBase64(), pieces, getInfoHash(), endpoint, incompleteFile, pieceSize, length, available, dataSinceLastRead, browse, feed, chat) - if (nextSession.sendRequest()) + if (nextSession.sendRequest()) { sessionQueue.addLast(nextSession) - - requestPerformed = sessionQueue.removeFirst().consumeResponse() + queuedPieces.add(nextSession.piece) + } + + def currentSession = sessionQueue.removeFirst() + requestPerformed = currentSession.consumeResponse() + queuedPieces.remove(currentSession.piece) if (!requestPerformed) break successfulDestinations.add(endpoint.destination)