From 4da7f7b6f900aadc45e440da9786bd92005b043d Mon Sep 17 00:00:00 2001 From: Gilbert Chen Date: Thu, 13 Jun 2019 14:47:21 -0400 Subject: [PATCH] Check -files may download a chunk multple times This commit fixed a bug that caused 'check -files' to download the same chunk multiple times if shared by multiple small files. --- src/duplicacy_chunkdownloader.go | 10 ++++++++++ src/duplicacy_snapshotmanager.go | 7 ++++--- 2 files changed, 14 insertions(+), 3 deletions(-) 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])