diff --git a/src/duplicacy_chunkdownloader.go b/src/duplicacy_chunkdownloader.go index 98867ab..5cbef08 100644 --- a/src/duplicacy_chunkdownloader.go +++ b/src/duplicacy_chunkdownloader.go @@ -197,6 +197,16 @@ func (downloader *ChunkDownloader) Reclaim(chunkIndex int) { downloader.lastChunkIndex = chunkIndex } +// Return the chunk last downloaded and its hash +func (downloader *ChunkDownloader) GetLastDownloadedChunk() (chunk *Chunk, chunkHash string) { + if downloader.lastChunkIndex >= len(downloader.taskList) { + return nil, "" + } + + task := downloader.taskList[downloader.lastChunkIndex] + return task.chunk, task.chunkHash +} + // WaitForChunk waits until the specified chunk is ready func (downloader *ChunkDownloader) WaitForChunk(chunkIndex int) (chunk *Chunk) { diff --git a/src/duplicacy_snapshotmanager.go b/src/duplicacy_snapshotmanager.go index e4e6c6f..d79ee54 100644 --- a/src/duplicacy_snapshotmanager.go +++ b/src/duplicacy_snapshotmanager.go @@ -1194,7 +1194,6 @@ func (manager *SnapshotManager) RetrieveFile(snapshot *Snapshot, file *Entry, ou } var chunk *Chunk - currentHash := "" for i := file.StartChunk; i <= file.EndChunk; i++ { start := 0 @@ -1207,10 +1206,12 @@ func (manager *SnapshotManager) RetrieveFile(snapshot *Snapshot, file *Entry, ou } hash := snapshot.ChunkHashes[i] - if currentHash != hash { + lastChunk, lastChunkHash := manager.chunkDownloader.GetLastDownloadedChunk() + if lastChunkHash != hash { i := manager.chunkDownloader.AddChunk(hash) chunk = manager.chunkDownloader.WaitForChunk(i) - currentHash = hash + } else { + chunk = lastChunk } output(chunk.GetBytes()[start:end])