Merge pull request #4618 from MichaelEischer/workaround-rclone-list-errors

rclone: Workaround for incorrect "not found" errors while listing files
This commit is contained in:
Michael Eischer 2024-01-09 18:28:31 +01:00 committed by GitHub
commit 7b2de84763
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 2 deletions

View 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

View file

@ -328,9 +328,14 @@ func (b *Backend) List(ctx context.Context, t backend.FileType, fn func(backend.
}
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
}
}
if resp.StatusCode != http.StatusOK {
return errors.Errorf("List failed, server response: %v (%v)", resp.Status, resp.StatusCode)