From e33ce7f408ea78392810ede89c42cd195b60a2f1 Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Thu, 9 May 2024 15:44:05 +0200 Subject: [PATCH] repository: retry failed LoadBlob once --- internal/repository/repository.go | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/internal/repository/repository.go b/internal/repository/repository.go index f4d83c1e1..77652278f 100644 --- a/internal/repository/repository.go +++ b/internal/repository/repository.go @@ -235,11 +235,27 @@ func (r *Repository) LoadBlob(ctx context.Context, t restic.BlobType, id restic. // try cached pack files first sortCachedPacksFirst(r.Cache, blobs) + buf, err := r.loadBlob(ctx, blobs, buf) + if err != nil { + if r.Cache != nil { + for _, blob := range blobs { + h := backend.Handle{Type: restic.PackFile, Name: blob.PackID.String(), IsMetadata: blob.Type.IsMetadata()} + // ignore errors as there's not much we can do here + _ = r.Cache.Forget(h) + } + } + + buf, err = r.loadBlob(ctx, blobs, buf) + } + return buf, err +} + +func (r *Repository) loadBlob(ctx context.Context, blobs []restic.PackedBlob, buf []byte) ([]byte, error) { var lastError error for _, blob := range blobs { - debug.Log("blob %v/%v found: %v", t, id, blob) + debug.Log("blob %v found: %v", blob.BlobHandle, blob) // load blob from pack - h := backend.Handle{Type: restic.PackFile, Name: blob.PackID.String(), IsMetadata: t.IsMetadata()} + h := backend.Handle{Type: restic.PackFile, Name: blob.PackID.String(), IsMetadata: blob.Type.IsMetadata()} switch { case cap(buf) < int(blob.Length): @@ -281,7 +297,7 @@ func (r *Repository) LoadBlob(ctx context.Context, t restic.BlobType, id restic. return nil, lastError } - return nil, errors.Errorf("loading blob %v from %v packs failed", id.Str(), len(blobs)) + return nil, errors.Errorf("loading %v from %v packs failed", blobs[0].BlobHandle, len(blobs)) } // LookupBlobSize returns the size of blob id.