mirror of
https://github.com/octoleo/restic.git
synced 2024-11-22 04:45:15 +00:00
rclone: Workaround for incorrect "not found" errors while listing files
rclone returns a "not found" error if an internal error occurs while listing a folder. Ignoring this error lets restic erroneously think that there are no files, which can cause `prune` to wipe the whole repository.
This commit is contained in:
parent
634e2a46d9
commit
2e8de9edfd
11
changelog/unreleased/issue-4612
Normal file
11
changelog/unreleased/issue-4612
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
Bugfix: Improve error handling for `rclone` backend
|
||||||
|
|
||||||
|
Since restic 0.16.0, if rclone encountered an error while listing files,
|
||||||
|
this could in rare circumstances cause restic to assume that there are no
|
||||||
|
files. Although unlikely, this situation could result in data loss if it
|
||||||
|
were to happen right when the `prune` command is listing existing snapshots.
|
||||||
|
|
||||||
|
Error handling has now been improved to detect and work around this case.
|
||||||
|
|
||||||
|
https://github.com/restic/restic/issues/4612
|
||||||
|
https://github.com/restic/restic/pull/4618
|
@ -328,9 +328,14 @@ func (b *Backend) List(ctx context.Context, t backend.FileType, fn func(backend.
|
|||||||
}
|
}
|
||||||
|
|
||||||
if resp.StatusCode == http.StatusNotFound {
|
if resp.StatusCode == http.StatusNotFound {
|
||||||
// ignore missing directories
|
if !strings.HasPrefix(resp.Header.Get("Server"), "rclone/") {
|
||||||
|
// ignore missing directories, unless the server is rclone. rclone
|
||||||
|
// already ignores missing directories, but misuses "not found" to
|
||||||
|
// report certain internal errors, see
|
||||||
|
// https://github.com/rclone/rclone/pull/7550 for details.
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if resp.StatusCode != http.StatusOK {
|
if resp.StatusCode != http.StatusOK {
|
||||||
return errors.Errorf("List failed, server response: %v (%v)", resp.Status, resp.StatusCode)
|
return errors.Errorf("List failed, server response: %v (%v)", resp.Status, resp.StatusCode)
|
||||||
|
Loading…
Reference in New Issue
Block a user