Resuming downloads
This page provides an overview of how download resumption is implemented
func (req *DownloadRequest) calculateShardsParams(
fRef *fileref.FileRef, remotePathCB string) (chunksPerShard int64, err error) {
size := fRef.ActualFileSize
if req.contentMode == DOWNLOAD_CONTENT_THUMB {
if fRef.ActualThumbnailSize == 0 {
return 0, errors.New("invalid_request", "Thumbnail does not exist")
}
size = fRef.ActualThumbnailSize
}
req.size = size
req.encryptedKey = fRef.EncryptedKey
req.chunkSize = int(fRef.ChunkSize)
effectivePerShardSize := (size + int64(req.datashards) - 1) / int64(req.datashards)
effectiveBlockSize := fRef.ChunkSize
if fRef.EncryptedKey != "" {
effectiveBlockSize -= EncryptionHeaderSize + EncryptedDataPaddingSize
}
req.effectiveBlockSize = int(effectiveBlockSize)
chunksPerShard = (effectivePerShardSize + effectiveBlockSize - 1) / effectiveBlockSize
info, err := req.fileHandler.Stat()
if err != nil {
return 0, err
}
_, err = req.Seek(info.Size(), io.SeekStart)
if err != nil {
return 0, err
}
effectiveChunkSize := effectiveBlockSize * int64(req.datashards)
if req.offset > 0 {
req.startBlock += req.offset / effectiveChunkSize
}
if req.endBlock == 0 || req.endBlock > chunksPerShard {
req.endBlock = chunksPerShard
}
if req.startBlock >= req.endBlock {
err = errors.New("invalid_block_num", "start block should be less than end block")
return 0, err
}
return
}Last updated