Retry on unexpected EOF when dowloading files

This commit is contained in:
Gilbert Chen
2017-10-18 22:09:16 -04:00
parent c08a26a0c2
commit 0db7470af5

View File

@@ -5,6 +5,7 @@
package duplicacy
import (
"io"
"sync/atomic"
"time"
)
@@ -328,18 +329,24 @@ func (downloader *ChunkDownloader) Download(threadIndex int, task ChunkDownloadT
for downloadAttempt := 0;; downloadAttempt++ {
err = downloader.storage.DownloadFile(threadIndex, chunkPath, chunk)
if err != nil {
LOG_ERROR("UPLOAD_FATAL", "Failed to download the chunk %s: %v", chunkID, err)
if err == io.ErrUnexpectedEOF && downloadAttempt < MaxDownloadAttempts {
LOG_WARN("DOWNLOAD_RETRY", "Failed to download the chunk %s: %v; retrying", chunkID, err)
chunk.Reset(false)
continue
} else {
LOG_ERROR("DOWNLOAD_CHUNK", "Failed to download the chunk %s: %v", chunkID, err)
return false
}
}
err = chunk.Decrypt(downloader.config.ChunkKey, task.chunkHash)
if err != nil {
if downloadAttempt < MaxDownloadAttempts {
LOG_WARN("RETRY_DOWNLOAD", "Failed to decrypt the chunk %s: %v; retrying", chunkID, err)
LOG_WARN("DOWNLOAD_RETRY", "Failed to decrypt the chunk %s: %v; retrying", chunkID, err)
chunk.Reset(false)
continue
} else {
LOG_ERROR("UPLOAD_CHUNK", "Failed to decrypt the chunk %s: %v", chunkID, err)
LOG_ERROR("DOWNLOAD_DECRYPT", "Failed to decrypt the chunk %s: %v", chunkID, err)
return false
}
}
@@ -347,11 +354,11 @@ func (downloader *ChunkDownloader) Download(threadIndex int, task ChunkDownloadT
actualChunkID := chunk.GetID()
if actualChunkID != chunkID {
if downloadAttempt < MaxDownloadAttempts {
LOG_WARN("RETRY_DOWNLOAD", "The chunk %s has a hash id of %s; retrying", chunkID, actualChunkID)
LOG_WARN("DOWNLOAD_RETRY", "The chunk %s has a hash id of %s; retrying", chunkID, actualChunkID)
chunk.Reset(false)
continue
} else {
LOG_FATAL("UPLOAD_CORRUPTED", "The chunk %s has a hash id of %s", chunkID, actualChunkID)
LOG_FATAL("DOWNLOAD_CORRUPTED", "The chunk %s has a hash id of %s", chunkID, actualChunkID)
return false
}
}