From 3f94e70488022774dbd7e717ab2f11c4e6056865 Mon Sep 17 00:00:00 2001 From: Anderson Mesquita Date: Mon, 21 Dec 2015 13:29:18 -0500 Subject: [PATCH] WIP: Consider tempfile when checking for free space (fixes #2598) Checks the existing blocks that can be reused when downloading a file so that it only requires the space corresponding to the missing blocks. This will prevent syncthing from claiming the folder doesn't have enough space when resuming download of large files after they have been partially downloaded. --- lib/model/rwfolder.go | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/lib/model/rwfolder.go b/lib/model/rwfolder.go index 8cb885a99..6d5f0aef8 100644 --- a/lib/model/rwfolder.go +++ b/lib/model/rwfolder.go @@ -969,25 +969,11 @@ func (p *rwFolder) handleFile(file protocol.FileInfo, copyChan chan<- copyBlocks } } - if p.checkFreeSpace { - if free, err := osutil.DiskFreeBytes(p.dir); err == nil && free < file.Size() { - l.Warnf(`Folder "%s": insufficient disk space in %s for %s: have %.2f MiB, need %.2f MiB`, p.folder, p.dir, file.Name, float64(free)/1024/1024, float64(file.Size())/1024/1024) - p.newError(file.Name, errors.New("insufficient space")) - return - } - } - - events.Default.Log(events.ItemStarted, map[string]string{ - "folder": p.folder, - "item": file.Name, - "type": "file", - "action": "update", - }) - scanner.PopulateOffsets(file.Blocks) reused := 0 var blocks []protocol.BlockInfo + var blocksSize int64 // Check for an old temporary file which might have some blocks we could // reuse. @@ -1007,6 +993,7 @@ func (p *rwFolder) handleFile(file protocol.FileInfo, copyChan chan<- copyBlocks _, ok := existingBlocks[block.String()] if !ok { blocks = append(blocks, block) + blocksSize += int64(block.Size) } } @@ -1021,8 +1008,24 @@ func (p *rwFolder) handleFile(file protocol.FileInfo, copyChan chan<- copyBlocks } } else { blocks = file.Blocks + blocksSize = file.Size() } + if p.checkFreeSpace { + if free, err := osutil.DiskFreeBytes(p.dir); err == nil && free < blocksSize { + l.Warnf(`Folder "%s": insufficient disk space in %s for %s: have %.2f MiB, need %.2f MiB`, p.folder, p.dir, file.Name, float64(free)/1024/1024, float64(blocksSize)/1024/1024) + p.newError(file.Name, errors.New("insufficient space")) + return + } + } + + events.Default.Log(events.ItemStarted, map[string]string{ + "folder": p.folder, + "item": file.Name, + "type": "file", + "action": "update", + }) + s := sharedPullerState{ file: file, folder: p.folder,