From 0991b7caf02ba68bdbb277f3a462a71e2f76d30d Mon Sep 17 00:00:00 2001 From: Gero Posmyk-Leinemann Date: Mon, 9 Jun 2025 15:21:39 +0000 Subject: [PATCH] [registry facade] Don't retry requests with error messages that were successful --- .../blobserve/pkg/blobserve/refstore_test.go | 2 +- .../registry-facade/pkg/registry/manifest.go | 31 +++++++++++++++++-- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/components/blobserve/pkg/blobserve/refstore_test.go b/components/blobserve/pkg/blobserve/refstore_test.go index a25ea38e64f660..509109ded4231e 100644 --- a/components/blobserve/pkg/blobserve/refstore_test.go +++ b/components/blobserve/pkg/blobserve/refstore_test.go @@ -118,7 +118,7 @@ func TestBlobFor(t *testing.T) { refDescriptor: provideDescriptor, }, Expectation: Expectation{ - Error: "cannot fetch manifest: " + hashManifest + " not found", + Error: "failed to fetch manifest: " + hashManifest + " not found", }, }, { diff --git a/components/registry-facade/pkg/registry/manifest.go b/components/registry-facade/pkg/registry/manifest.go index 6828113a0e8817..66e4013d7a8dd4 100644 --- a/components/registry-facade/pkg/registry/manifest.go +++ b/components/registry-facade/pkg/registry/manifest.go @@ -318,7 +318,10 @@ func DownloadConfig(ctx context.Context, fetch FetcherFunc, ref string, desc oci rc, err = fetcher.Fetch(ctx, desc) if err != nil { log.WithError(err).Warn("cannot fetch config") - return false, nil // retry + if retryableError(err) { + return false, nil // retry + } + return false, err } defer rc.Close() } @@ -467,7 +470,10 @@ func DownloadManifest(ctx context.Context, fetch FetcherFunc, desc ociv1.Descrip rc, err = fetcher.Fetch(ctx, desc) if err != nil { log.WithError(err).Warn("cannot fetch manifest") - return false, nil // retry + if retryableError(err) { + return false, nil // retry + } + return false, err } mediaType = desc.MediaType } @@ -521,7 +527,10 @@ func DownloadManifest(ctx context.Context, fetch FetcherFunc, desc ociv1.Descrip rc, err = fetcher.Fetch(ctx, md) if err != nil { log.WithError(err).Warn("cannot download config") - return false, nil // retry + if retryableError(err) { + return false, nil // retry + } + return false, err } rdesc = &md inpt, err = io.ReadAll(rc) @@ -587,3 +596,19 @@ func (mh *manifestHandler) putManifest(w http.ResponseWriter, r *http.Request) { func (mh *manifestHandler) deleteManifest(w http.ResponseWriter, r *http.Request) { respondWithError(w, distv2.ErrorCodeManifestUnknown) } + +func retryableError(err error) bool { + if err == nil { + return false + } + if errors.Is(err, errdefs.ErrNotFound) || errors.Is(err, errdefs.ErrInvalidArgument) { + return false + } + if strings.Contains(err.Error(), "not found") || + strings.Contains(err.Error(), "invalid argument") || + strings.Contains(err.Error(), "not implemented") || + strings.Contains(err.Error(), "unsupported media type") { + return false + } + return true +}