diff --git a/pkg/image/importer/client.go b/pkg/image/importer/client.go index 2bd6e4bc650a..b9498810370f 100644 --- a/pkg/image/importer/client.go +++ b/pkg/image/importer/client.go @@ -407,3 +407,13 @@ func (r retryBlobStore) ServeBlob(ctx context.Context, w http.ResponseWriter, re } } } + +func (r retryBlobStore) Open(ctx context.Context, dgst digest.Digest) (distribution.ReadSeekCloser, error) { + for { + if rsc, err := r.BlobStore.Open(ctx, dgst); r.repo.shouldRetry(err) { + continue + } else { + return rsc, err + } + } +} diff --git a/pkg/image/importer/client_test.go b/pkg/image/importer/client_test.go index 8b10f2a1b5d0..040456561152 100644 --- a/pkg/image/importer/client_test.go +++ b/pkg/image/importer/client_test.go @@ -75,7 +75,7 @@ func (r *mockRepository) GetByTag(tag string, options ...distribution.ManifestSe type mockBlobStore struct { distribution.BlobStore - statErr, serveErr error + statErr, serveErr, openErr error } func (r *mockBlobStore) Stat(ctx context.Context, dgst digest.Digest) (distribution.Descriptor, error) { @@ -86,6 +86,10 @@ func (r *mockBlobStore) ServeBlob(ctx context.Context, w http.ResponseWriter, re return r.serveErr } +func (r *mockBlobStore) Open(ctx context.Context, dgst digest.Digest) (distribution.ReadSeekCloser, error) { + return nil, r.openErr +} + func TestSchema1ToImage(t *testing.T) { m := &schema1.SignedManifest{} if err := json.Unmarshal([]byte(etcdManifest), m); err != nil { @@ -284,6 +288,7 @@ func TestRetryFailure(t *testing.T) { blobs: &mockBlobStore{ serveErr: errcode.ErrorCodeUnauthorized, statErr: errcode.ErrorCodeUnauthorized, + openErr: errcode.ErrorCodeUnauthorized, }, } r = NewRetryRepository(repo, 4, 0).(*retryRepository) @@ -326,4 +331,8 @@ func TestRetryFailure(t *testing.T) { if err := b.ServeBlob(nil, nil, nil, digest.Digest("foo")); err != repo.getErr || r.retries != 0 { t.Fatalf("unexpected: %v %v %#v", m, err, r) } + r.retries = 2 + if _, err := b.Open(nil, digest.Digest("foo")); err != repo.getErr || r.retries != 0 { + t.Fatalf("unexpected: %v %v %#v", m, err, r) + } }