diff --git a/internal/repository/checker.go b/internal/repository/checker.go index c3f530abf..845048b4a 100644 --- a/internal/repository/checker.go +++ b/internal/repository/checker.go @@ -306,7 +306,7 @@ func (c *Checker) ReadPacks(ctx context.Context, filter func(packs map[restic.ID } // push packs to ch - for pbs := range c.repo.ListPacksFromIndex(ctx, packSet) { + for pbs := range c.repo.listPacksFromIndex(ctx, packSet) { size := packs[pbs.PackID] debug.Log("listed %v", pbs.PackID) select { diff --git a/internal/repository/debug.go b/internal/repository/debug.go index 29cb5b672..8bf25a715 100644 --- a/internal/repository/debug.go +++ b/internal/repository/debug.go @@ -116,15 +116,14 @@ func ExaminePack(ctx context.Context, repo *Repository, id restic.ID, opts Exami blobsLoaded := false // examine all data the indexes have for the pack file - for b := range repo.ListPacksFromIndex(ctx, restic.NewIDSet(id)) { - blobs := b.Blobs - if len(blobs) == 0 { + for b := range repo.listPacksFromIndex(ctx, restic.NewIDSet(id)) { + if len(b.Blobs) == 0 { continue } - checkPackSize(blobs, len(buf), printer) + checkPackSize(b.Blobs, len(buf), printer) - err = loadBlobs(ctx, opts, repo, id, blobs, printer) + err = loadBlobs(ctx, opts, repo, id, b.Blobs, printer) if err != nil { printer.E("error: %v", err) } else { diff --git a/internal/repository/repack.go b/internal/repository/repack.go index 6900eb96c..a4472c91e 100644 --- a/internal/repository/repack.go +++ b/internal/repository/repack.go @@ -83,7 +83,7 @@ func repack( downloadQueue := make(chan restic.PackBlobs) wg.Go(func() error { defer close(downloadQueue) - for pbs := range repo.ListPacksFromIndex(wgCtx, packs) { + for pbs := range repo.listPacksFromIndex(wgCtx, packs) { var packBlobs restic.Blobs keepMutex.Lock() // filter out unnecessary blobs diff --git a/internal/repository/repair_pack.go b/internal/repository/repair_pack.go index bff83b846..a7d04bbc2 100644 --- a/internal/repository/repair_pack.go +++ b/internal/repository/repair_pack.go @@ -23,7 +23,7 @@ func RepairPacks(ctx context.Context, repo *Repository, ids restic.IDSet, printe err = repo.WithBlobUploader(ctx, func(ctx context.Context, uploader restic.BlobSaverWithAsync) error { // examine all data the indexes have for the pack file - for b := range repo.ListPacksFromIndex(ctx, ids) { + for b := range repo.listPacksFromIndex(ctx, ids) { indexBlobs := b.Blobs err := reuploadBlobsFromPack(ctx, repo, b.PackID, indexBlobs, printer, uploader) if err != nil { diff --git a/internal/repository/repair_pack_test.go b/internal/repository/repair_pack_test.go index 54f0ca02a..a8c532a65 100644 --- a/internal/repository/repair_pack_test.go +++ b/internal/repository/repair_pack_test.go @@ -66,13 +66,11 @@ func testRepairBrokenPack(t *testing.T, version uint) { // find blob that starts at offset 0 var damagedBlob restic.BlobHandle - for blobs := range repo.ListPacksFromIndex(context.TODO(), restic.NewIDSet(damagedID)) { - for _, blob := range blobs.Blobs { - if blob.Offset == 0 { - damagedBlob = blob.BlobHandle - } + _ = repo.ListBlobs(context.TODO(), func(pb restic.PackedBlob) { + if pb.PackID == damagedID && pb.Offset == 0 { + damagedBlob = pb.BlobHandle } - } + }) return restic.NewIDSet(damagedID), restic.NewBlobSet(damagedBlob) }, @@ -89,11 +87,11 @@ func testRepairBrokenPack(t *testing.T, version uint) { // all blobs in the file are broken damagedBlobs := restic.NewBlobSet() - for blobs := range repo.ListPacksFromIndex(context.TODO(), restic.NewIDSet(damagedID)) { - for _, blob := range blobs.Blobs { - damagedBlobs.Insert(blob.BlobHandle) + _ = repo.ListBlobs(context.TODO(), func(pb restic.PackedBlob) { + if pb.PackID == damagedID { + damagedBlobs.Insert(pb.BlobHandle) } - } + }) return restic.NewIDSet(damagedID), damagedBlobs }, }, { diff --git a/internal/repository/repository.go b/internal/repository/repository.go index d9d3f10ce..500e9b06d 100644 --- a/internal/repository/repository.go +++ b/internal/repository/repository.go @@ -691,7 +691,8 @@ func (r *Repository) ListBlobs(ctx context.Context, fn func(restic.PackedBlob)) return nil } -func (r *Repository) ListPacksFromIndex(ctx context.Context, packs restic.IDSet) <-chan restic.PackBlobs { +// listPacksFromIndex returns index entries for the given packs, grouped by pack file. +func (r *Repository) listPacksFromIndex(ctx context.Context, packs restic.IDSet) <-chan restic.PackBlobs { return r.idx.ListPacks(ctx, packs) } diff --git a/internal/restic/repository.go b/internal/restic/repository.go index 561755c6c..7986e2f74 100644 --- a/internal/restic/repository.go +++ b/internal/restic/repository.go @@ -31,7 +31,6 @@ type Repository interface { // ListBlobs runs fn on all blobs known to the index. When the context is cancelled, // the index iteration returns immediately with ctx.Err(). This blocks any modification of the index. ListBlobs(ctx context.Context, fn func(PackedBlob)) error - ListPacksFromIndex(ctx context.Context, packs IDSet) <-chan PackBlobs // ListPackHandles returns the blob handles stored in the pack file header. ListPackHandles(ctx context.Context, id ID, packSize int64) ([]BlobHandle, error)