Browse Source

Merge pull request #2614 from andersonvom/issue-2598

WIP: Consider tempfile when checking for free space (fixes #2598)
Jakob Borg 10 years ago
parent
commit
c7aec839ae
1 changed files with 18 additions and 15 deletions
  1. 18 15
      lib/model/rwfolder.go

+ 18 - 15
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,