summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakob Borg <jakob@nym.se>2015-09-05 09:43:07 +0200
committerJakob Borg <jakob@nym.se>2015-09-06 08:47:52 +0200
commit41c131d840ffcb5eb26f930ce73d7185aa54d963 (patch)
tree59e37cd047908d46e7c5eb1e221885440c640778
parent66df2e57ae5ff205226cd3214e25e942c3ef4989 (diff)
Allow fractional free space percentages (fixes #2233)v0.11.24
-rw-r--r--gui/syncthing/folder/editFolderModalView.html4
-rw-r--r--lib/auto/gui.files.go4
-rw-r--r--lib/config/config.go11
-rw-r--r--lib/config/config_test.go2
-rwxr-xr-xlib/config/testdata/overridenvalues.xml2
-rw-r--r--lib/model/model.go4
-rw-r--r--lib/model/rwfolder.go15
7 files changed, 24 insertions, 18 deletions
diff --git a/gui/syncthing/folder/editFolderModalView.html b/gui/syncthing/folder/editFolderModalView.html
index 15df9a21a..eceac4eda 100644
--- a/gui/syncthing/folder/editFolderModalView.html
+++ b/gui/syncthing/folder/editFolderModalView.html
@@ -40,8 +40,8 @@
</p>
</div>
<div class="form-group" ng-class="{'has-error': folderEditor.minDiskFreePct.$invalid && folderEditor.minDiskFreePct.$dirty}">
- <label for="minDiskFreePct"><span translate>Minimum Free Disk Space</span> (0-100%)</label>
- <input name="minDiskFreePct" id="minDiskFreePct" class="form-control" type="number" ng-model="currentFolder.minDiskFreePct" required min="0" max="100"></input>
+ <label for="minDiskFreePct"><span translate>Minimum Free Disk Space</span> (0.0 - 100.0%)</label>
+ <input name="minDiskFreePct" id="minDiskFreePct" class="form-control" type="number" ng-model="currentFolder.minDiskFreePct" required min="0.0" max="100.0"></input>
<p class="help-block">
<span translate ng-if="!folderEditor.minDiskFreePct.$valid && folderEditor.minDiskFreePct.$dirty">The minimum free disk space percentage must be a non-negative number between 0 and 100 (inclusive).</span>
</p>
diff --git a/lib/auto/gui.files.go b/lib/auto/gui.files.go
index 55884fba9..83f5d8c19 100644
--- a/lib/auto/gui.files.go
+++ b/lib/auto/gui.files.go
@@ -5,7 +5,7 @@ import (
)
const (
- AssetsBuildDate = "Sun, 30 Aug 2015 11:36:51 GMT"
+ AssetsBuildDate = "Sun, 06 Sep 2015 06:47:10 GMT"
)
func Assets() map[string][]byte {
@@ -89,7 +89,7 @@ func Assets() map[string][]byte {
assets["syncthing/device/idqrModalView.html"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/zSQPXLCMBCFe59iZxug0PgCttPQ0OQOQlqbnegnSAsJo+jukQ00Gj3pvW/e7uCj1Q7Yjsj2mhCyaLnlpsIcEdjEMOI1mWgJQVgcjVjK7kh3NgQnS0F4ZqOFY9jBH0jSITstVCsoKMVuxk/taS8Xzs/c/nCoFcHptDTcgzKCcTG/7lMHMFi+tzedW5Mfcg7WQ2UPQr+ifAwxf+tWYJOmlaCEUyn+cTrWOvQtvVHYLxAWxfOI6xe+kc+EOrtovqCZlFxu/hw0O1z9OZl16P5jxY9vLPZTN/TbvqbuHwAA//8BAAD//2Nevvg4AQAA")
assets["syncthing/device/module.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/0rMSy/NSSzSy81PKc1J1VAvrsxLLsnIzEvXS0kty0xOVddRiI7VtOYCAAAA//8BAAD//23b1z0oAAAA")
assets["syncthing/folder/editFolderModalDirective.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/1yOMQ+CMBCFd35Ft4OElF0mFzdH3Rt6wCVHa46rxhj+uxUSor7xfe/uPReGxE7sFH1iLGF+hk5HCoPtI3sUqAqTZT0Jdkr3HEFPelrhOXrHUJs+5SOKwZSVea35jwQ1SfgyNnNWoU4PBo5Q/yDF6cZO8SKc6T6k2YY0f7VXwocddWLYnyxtsVRt8QYAAP//AQAA//+34Oi50wAAAA==")
- assets["syncthing/folder/editFolderModalView.html"], _ = base64.StdEncoding.DecodeString("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")
+ assets["syncthing/folder/editFolderModalView.html"], _ = base64.StdEncoding.DecodeString("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")
assets["syncthing/folder/editIgnoresModalDirective.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/1yOsc7CMAyE9z5FtrRSle5/p39kYIQ9atzWkusgxwEh1HcnUKkCbrzz+T7PUyYvbokhE9Q23XnQGXlyY6QAYpvKFLmAAoPitZxAQD1MHAXSMQZPtjVjLi2MbOrGPN6FlwQ0C38Ym5lUcNA/Y/9t+xUpLBfyCiehku4k3UbS/e6eEW5u1oXs/mXtq7XpqycAAAD//wEAAP//eXHskdUAAAA=")
assets["syncthing/folder/editIgnoresModalView.html"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/5xVz27bPgy+9yn48+GHdGhiFOguneNL0QE9DNjQBxgYi7aFypIg0WmzIO8+2nFcB02XbofApkzx+/jxTzKl16DVMiGl+aGyLlBMoDAY4zJpnEIDJSpKgHGlraKXZTK/TvILgP7m1HGuNBpXwd4wVe91yq9wlsny8P2UR02CGUYHcalvjj1Ys+lYBbTRIFO+5w7fkZmCjVla34zxUwF4H2zl1GYK5SdR74VpAL2P7YfYV+CsWPLBaEuLLPWT20wvjIHwgFG60PQZB2cSCO5Zzq4/J3mWHjzzi0maIZ2a/hAlNmiMXIoe7YTej1YXT1C1WhGwg9h67wKTGqlmaXcjh1mGUAcql0nN7G/TVLkiLuLGFlxrWy0scdpGCjHtc+2Oam5MV/ZQES+TnyuD9mkqeNkaAxKmbaSWyNrZLMX88vZYDmUOKSgpq0T+JVJIU4llMYgcMKQ2XukucZ4VTlH+X5b2T6kg53Ku3ijwYNfCWsDBlcA1QaXXZEEEl37ujmd6QQvhCdYx0EthWkWXgywSVp0G/nQW+FE0MgSG1mTgWRtVYFAwa5CLmqKcdMICgtKBCnZhI01jNh9APg/9rTWs30Vuuq9eqL0i967xPHaansW+c01X7yt4rkVmaRkFyL3wUVqFuypgPxYnwcQyH5zK0jk+XgETFy+9NzdU8tuRuO/qbqtD4+8T226LNgTh/dUZWSwLGY96t9tu4yYyNb35SB4Dily73SLyfuJf1XhlKkRWLbN0Fm88LZO9Ma7MFVuQ39wH3aBI373HJgFbzQsjwyqjjGsaFu3sMgGFjLI5Y6PH3I+Hoc/vsExQtvFcylw8dRukT/F/u4r+y5v2FJTBYaL+nuxfpqKoROmpMZV/YMy6kb+VPzO+My6epTwpxfg6vAyP3wAAAP//AQAA//8ktcnt0QYAAA==")
assets["syncthing/folder/module.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/0rMSy/NSSzSy81PKc1J1VAvrsxLLsnIzEvXS8vPSUktUtdRiI7VtOYCAAAA//8BAAD//4Nu4g4oAAAA")
diff --git a/lib/config/config.go b/lib/config/config.go
index 7abca84ef..e06ff546a 100644
--- a/lib/config/config.go
+++ b/lib/config/config.go
@@ -74,7 +74,7 @@ type FolderConfiguration struct {
RescanIntervalS int `xml:"rescanIntervalS,attr" json:"rescanIntervalS"`
IgnorePerms bool `xml:"ignorePerms,attr" json:"ignorePerms"`
AutoNormalize bool `xml:"autoNormalize,attr" json:"autoNormalize"`
- MinDiskFreePct int `xml:"minDiskFreePct" json:"minDiskFreePct"`
+ MinDiskFreePct float64 `xml:"minDiskFreePct" json:"minDiskFreePct"`
Versioning VersioningConfiguration `xml:"versioning" json:"versioning"`
Copiers int `xml:"copiers" json:"copiers"` // This defines how many files are handled concurrently.
Pullers int `xml:"pullers" json:"pullers"` // Defines how many blocks are fetched at the same time, possibly between separate copier routines.
@@ -238,7 +238,7 @@ type OptionsConfiguration struct {
DatabaseBlockCacheMiB int `xml:"databaseBlockCacheMiB" json:"databaseBlockCacheMiB" default:"0"`
PingTimeoutS int `xml:"pingTimeoutS" json:"pingTimeoutS" default:"30"`
PingIdleTimeS int `xml:"pingIdleTimeS" json:"pingIdleTimeS" default:"60"`
- MinHomeDiskFreePct int `xml:"minHomeDiskFreePct" json:"minHomeDiskFreePct" default:"1"`
+ MinHomeDiskFreePct float64 `xml:"minHomeDiskFreePct" json:"minHomeDiskFreePct" default:"1"`
}
func (orig OptionsConfiguration) Copy() OptionsConfiguration {
@@ -534,6 +534,13 @@ func setDefaults(data interface{}) error {
}
f.SetInt(i)
+ case float64:
+ i, err := strconv.ParseFloat(v, 64)
+ if err != nil {
+ return err
+ }
+ f.SetFloat(i)
+
case bool:
f.SetBool(v == "true")
diff --git a/lib/config/config_test.go b/lib/config/config_test.go
index 0a8b39423..2f25f36f4 100644
--- a/lib/config/config_test.go
+++ b/lib/config/config_test.go
@@ -166,7 +166,7 @@ func TestOverriddenValues(t *testing.T) {
DatabaseBlockCacheMiB: 42,
PingTimeoutS: 60,
PingIdleTimeS: 120,
- MinHomeDiskFreePct: 5,
+ MinHomeDiskFreePct: 5.2,
}
cfg, err := Load("testdata/overridenvalues.xml", device1)
diff --git a/lib/config/testdata/overridenvalues.xml b/lib/config/testdata/overridenvalues.xml
index a67ec9a2b..6495140ae 100755
--- a/lib/config/testdata/overridenvalues.xml
+++ b/lib/config/testdata/overridenvalues.xml
@@ -26,6 +26,6 @@
<databaseBlockCacheMiB>42</databaseBlockCacheMiB>
<pingTimeoutS>60</pingTimeoutS>
<pingIdleTimeS>120</pingIdleTimeS>
- <minHomeDiskFreePct>5</minHomeDiskFreePct>
+ <minHomeDiskFreePct>5.2</minHomeDiskFreePct>
</options>
</configuration>
diff --git a/lib/model/model.go b/lib/model/model.go
index b6c1b3f13..4b91fe176 100644
--- a/lib/model/model.go
+++ b/lib/model/model.go
@@ -1670,7 +1670,7 @@ func (m *Model) BringToFront(folder, file string) {
// CheckFolderHealth checks the folder for common errors and returns the
// current folder error, or nil if the folder is healthy.
func (m *Model) CheckFolderHealth(id string) error {
- if minFree := float64(m.cfg.Options().MinHomeDiskFreePct); minFree > 0 {
+ if minFree := m.cfg.Options().MinHomeDiskFreePct; minFree > 0 {
if free, err := osutil.DiskFreePercentage(m.cfg.ConfigPath()); err == nil && free < minFree {
return errors.New("home disk is out of space")
}
@@ -1691,7 +1691,7 @@ func (m *Model) CheckFolderHealth(id string) error {
err = errors.New("folder path missing")
} else if !folder.HasMarker() {
err = errors.New("folder marker missing")
- } else if free, errDfp := osutil.DiskFreePercentage(folder.Path()); errDfp == nil && free < float64(folder.MinDiskFreePct) {
+ } else if free, errDfp := osutil.DiskFreePercentage(folder.Path()); errDfp == nil && free < folder.MinDiskFreePct {
err = errors.New("out of disk space")
}
} else if os.IsNotExist(err) {
diff --git a/lib/model/rwfolder.go b/lib/model/rwfolder.go
index 57b3bce94..c0827bb2a 100644
--- a/lib/model/rwfolder.go
+++ b/lib/model/rwfolder.go
@@ -508,14 +508,13 @@ func (p *rwFolder) pullerIteration(ignores *ignore.Matcher) int {
return true
})
- // Check if we are able to store all files on disk
- if pullFileSize > 0 {
- folder, ok := p.model.cfg.Folders()[p.folder]
- if ok {
- if free, err := osutil.DiskFreeBytes(folder.Path()); err == nil && free < pullFileSize {
- l.Infof("Puller (folder %q): insufficient disk space available to pull %d files (%.2fMB)", p.folder, changed, float64(pullFileSize)/1024/1024)
- return 0
- }
+ // Check if we are able to store all files on disk. Only perform this
+ // check if there is a minimum free space threshold set on the folder.
+ folderCfg := p.model.cfg.Folders()[p.folder]
+ if folderCfg.MinDiskFreePct > 0 || pullFileSize > 0 {
+ if free, err := osutil.DiskFreeBytes(folderCfg.Path()); err == nil && free < pullFileSize {
+ l.Warnf(`Folder "%s": insufficient disk space available to pull %d files (%.2f MiB)`, p.folder, changed, float64(pullFileSize)/1024/1024)
+ return 0
}
}