local backend: ignore not supported error on sync()

Closes #2395
This commit is contained in:
Hristo Trendev 2019-10-09 21:42:15 +02:00 committed by Leo R. Lundgren
parent 1a5b66f33b
commit 51c22f4223
2 changed files with 20 additions and 2 deletions

View file

@ -0,0 +1,12 @@
Enhancement: Ignore sync errors when operation not supported by local filesystem
The local backend has been modified to work with filesystems which doesn't support
the `sync` operation. This operation is normally used by restic to ensure that data
files are fully written to disk before continuing.
For these limited filesystems, saving a file in the backend would previously fail with
an "operation not supported" error. This error is now ignored, which means that e.g.
an SMB mount on macOS can now be used as storage location for a repository.
https://github.com/restic/restic/issues/2395
https://forum.restic.net/t/sync-errors-on-mac-over-smb/1859

View file

@ -5,6 +5,7 @@ import (
"io"
"os"
"path/filepath"
"syscall"
"github.com/restic/restic/internal/errors"
"github.com/restic/restic/internal/restic"
@ -115,8 +116,13 @@ func (b *Local) Save(ctx context.Context, h restic.Handle, rd restic.RewindReade
}
if err = f.Sync(); err != nil {
_ = f.Close()
return errors.Wrap(err, "Sync")
pathErr, ok := err.(*os.PathError)
isNotSupported := ok && pathErr.Op == "sync" && pathErr.Err == syscall.ENOTSUP
// ignore error if filesystem does not support the sync operation
if !isNotSupported {
_ = f.Close()
return errors.Wrap(err, "Sync")
}
}
err = f.Close()