From 7fc54ed98ef08d0314cb427d098c8a2bcb2ff5bd Mon Sep 17 00:00:00 2001 From: Alexander Neumann Date: Tue, 18 Jul 2017 23:07:29 +0200 Subject: [PATCH 1/2] Improve test case for `prune` --- src/cmds/restic/integration_test.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/cmds/restic/integration_test.go b/src/cmds/restic/integration_test.go index e499e6394..2ee21a506 100644 --- a/src/cmds/restic/integration_test.go +++ b/src/cmds/restic/integration_test.go @@ -1175,15 +1175,19 @@ func TestPrune(t *testing.T) { SetupTarTestFixture(t, env.testdata, datafile) opts := BackupOptions{} - testRunBackup(t, []string{filepath.Join(env.testdata, "0", "0", "1")}, opts, gopts) + testRunBackup(t, []string{filepath.Join(env.testdata, "0", "0")}, opts, gopts) + firstSnapshot := testRunList(t, "snapshots", gopts) + Assert(t, len(firstSnapshot) == 1, + "expected one snapshot, got %v", firstSnapshot) + testRunBackup(t, []string{filepath.Join(env.testdata, "0", "0", "2")}, opts, gopts) testRunBackup(t, []string{filepath.Join(env.testdata, "0", "0", "3")}, opts, gopts) snapshotIDs := testRunList(t, "snapshots", gopts) Assert(t, len(snapshotIDs) == 3, - "expected one snapshot, got %v", snapshotIDs) + "expected 3 snapshot, got %v", snapshotIDs) - testRunForget(t, gopts, snapshotIDs[0].String()) + testRunForget(t, gopts, firstSnapshot[0].String()) testRunPrune(t, gopts) testRunCheck(t, gopts) }) From bd31281f1e134c453ae451800fce3261adc0b45b Mon Sep 17 00:00:00 2001 From: Alexander Neumann Date: Tue, 18 Jul 2017 23:07:40 +0200 Subject: [PATCH 2/2] prune: Fix newly created index This fixes a bug introduced in c79fb6fcdd254382705753957bd299472696a2c6 where the index file after a prune contains pack files that do not exist any more. Restic will detect this during backup and abort with an error message until the user runs `prune` or `rebuild-index` again. --- src/cmds/restic/cmd_prune.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/cmds/restic/cmd_prune.go b/src/cmds/restic/cmd_prune.go index e841c7d38..aa7b9e76c 100644 --- a/src/cmds/restic/cmd_prune.go +++ b/src/cmds/restic/cmd_prune.go @@ -235,22 +235,23 @@ func pruneRepository(gopts GlobalOptions, repo restic.Repository) error { Verbosef("will delete %d packs and rewrite %d packs, this frees %s\n", len(removePacks), len(rewritePacks), formatBytes(uint64(removeBytes))) - var repackedBlobs restic.IDSet + var obsoletePacks restic.IDSet if len(rewritePacks) != 0 { bar = newProgressMax(!gopts.Quiet, uint64(len(rewritePacks)), "packs rewritten") bar.Start() - repackedBlobs, err = repository.Repack(ctx, repo, rewritePacks, usedBlobs, bar) + obsoletePacks, err = repository.Repack(ctx, repo, rewritePacks, usedBlobs, bar) if err != nil { return err } bar.Done() } + removePacks.Merge(obsoletePacks) + if err = rebuildIndex(ctx, repo, removePacks); err != nil { return err } - removePacks.Merge(repackedBlobs) if len(removePacks) != 0 { bar = newProgressMax(!gopts.Quiet, uint64(len(removePacks)), "packs deleted") bar.Start()