From 744a15247db3c940d4dcb87e0a5b79a4268a9a3c Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Tue, 31 Mar 2020 14:42:45 +0200 Subject: [PATCH] prune/rebuild-index: Fail if an old index cannot be removed The old behavior was problematic in the context of rebuild-index as it could leave old, possibly invalid index files behind without returning a fatal error. Prune calls rebuildIndex before removing any data from the repository. For this use case failing to delete an old index MUST be treated as a fatal error. Otherwise the index could still contain an old index file that refers to blobs/packs that were later on deleted by prune. Later backup runs will assume that the affected blobs already exist in the repository which results in a backup which misses data. --- cmd/restic/cmd_rebuild_index.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cmd/restic/cmd_rebuild_index.go b/cmd/restic/cmd_rebuild_index.go index bfa121338..b5f23aad7 100644 --- a/cmd/restic/cmd_rebuild_index.go +++ b/cmd/restic/cmd_rebuild_index.go @@ -92,7 +92,10 @@ func rebuildIndex(ctx context.Context, repo restic.Repository, ignorePacks resti Verbosef("saved new indexes as %v\n", ids) Verbosef("remove %d old index files\n", len(supersedes)) - DeleteFiles(globalOptions, repo, restic.NewIDSet(supersedes...), restic.IndexFile) + err = DeleteFilesChecked(globalOptions, repo, restic.NewIDSet(supersedes...), restic.IndexFile) + if err != nil { + return errors.Fatalf("unable to remove an old index: %v\n", err) + } return nil }