2
2
mirror of https://github.com/octoleo/restic.git synced 2024-12-22 10:58:55 +00:00

Merge pull request #4075 from greatroar/sftp-enospc

sftp: Fix ENOSPC check
This commit is contained in:
Michael Eischer 2022-12-09 22:00:13 +01:00 committed by GitHub
commit 4b98b5562d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 14 additions and 3 deletions

View File

@ -0,0 +1,12 @@
Bugfix: SFTP backend now checks for disk space
A backup to an SFTP backend would spew repeated SSH_FX_FAILURE messages when
the remote disk is full. Restic now reports "sftp: no space left on device"
and exits immediately when it detects this condition.
A fix for this issue was promised in restic 0.12.1, but the fix itself
contained a bug that prevented it from triggering.
https://github.com/restic/restic/issues/3336
https://github.com/restic/restic/pull/3345
https://github.com/restic/restic/pull/4075

View File

@ -354,14 +354,13 @@ func (r *SFTP) Save(ctx context.Context, h restic.Handle, rd restic.RewindReader
debug.Log("sftp: failed to remove broken file %v: %v", debug.Log("sftp: failed to remove broken file %v: %v",
f.Name(), rmErr) f.Name(), rmErr)
} }
err = r.checkNoSpace(dirname, rd.Length(), err)
}() }()
// save data, make sure to use the optimized sftp upload method // save data, make sure to use the optimized sftp upload method
wbytes, err := f.ReadFrom(rd) wbytes, err := f.ReadFrom(rd)
if err != nil { if err != nil {
_ = f.Close() _ = f.Close()
err = r.checkNoSpace(dirname, rd.Length(), err)
return errors.Wrap(err, "Write") return errors.Wrap(err, "Write")
} }
@ -403,7 +402,7 @@ func (r *SFTP) checkNoSpace(dir string, size int64, origErr error) error {
debug.Log("sftp: StatVFS returned %v", err) debug.Log("sftp: StatVFS returned %v", err)
return origErr return origErr
} }
if fsinfo.Favail == 0 || fsinfo.FreeSpace() < uint64(size) { if fsinfo.Favail == 0 || fsinfo.Frsize*fsinfo.Bavail < uint64(size) {
err := errors.New("sftp: no space left on device") err := errors.New("sftp: no space left on device")
return backoff.Permanent(err) return backoff.Permanent(err)
} }