From 84d7f17b6fca2724cb96fc1b6a556a78a1dacd66 Mon Sep 17 00:00:00 2001 From: "stonezdj(Daojun Zhang)" Date: Mon, 15 Jan 2024 13:45:30 +0800 Subject: [PATCH] [cherry-pick] Cache image list with digest key (#19837) Cache image list with digest key fixes #19429 Signed-off-by: stonezdj Co-authored-by: stonezdj --- src/controller/proxy/controller.go | 11 +++++++---- src/controller/proxy/controller_test.go | 2 +- src/controller/proxy/manifestcache.go | 5 ++++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/controller/proxy/controller.go b/src/controller/proxy/controller.go index 30a06aead..344a1fe7d 100644 --- a/src/controller/proxy/controller.go +++ b/src/controller/proxy/controller.go @@ -183,7 +183,10 @@ func (c *controller) UseLocalManifest(ctx context.Context, art lib.ArtifactInfo, if c.cache == nil { return a != nil && string(desc.Digest) == a.Digest, nil, nil // digest matches } - + // Pass digest to the cache key, digest is more stable than tag, because tag could be updated + if len(art.Digest) == 0 { + art.Digest = string(desc.Digest) + } err = c.cache.Fetch(ctx, manifestListKey(art.Repository, art), &content) if err != nil { if errors.Is(err, cache.ErrNotFound) { @@ -318,8 +321,8 @@ func getRemoteRepo(art lib.ArtifactInfo) string { } func getReference(art lib.ArtifactInfo) string { - if len(art.Tag) > 0 { - return art.Tag + if len(art.Digest) > 0 { + return art.Digest } - return art.Digest + return art.Tag } diff --git a/src/controller/proxy/controller_test.go b/src/controller/proxy/controller_test.go index f141e1bc6..a25fe959a 100644 --- a/src/controller/proxy/controller_test.go +++ b/src/controller/proxy/controller_test.go @@ -209,7 +209,7 @@ func TestGetRef(t *testing.T) { { name: `normal`, in: lib.ArtifactInfo{Repository: "hello-world", Tag: "latest", Digest: "sha256:aabbcc"}, - want: "latest", + want: "sha256:aabbcc", }, { name: `digest_only`, diff --git a/src/controller/proxy/manifestcache.go b/src/controller/proxy/manifestcache.go index ceb690104..ed0efb11f 100644 --- a/src/controller/proxy/manifestcache.go +++ b/src/controller/proxy/manifestcache.go @@ -73,7 +73,10 @@ func (m *ManifestListCache) CacheContent(ctx context.Context, remoteRepo string, log.Errorf("failed to get reference, reference is empty, skip to cache manifest list") return } - // some registry will not return the digest in the HEAD request, if no digest returned, cache manifest list content with tag + // cache key should contain digest if digest exist + if len(art.Digest) == 0 { + art.Digest = string(digest.FromBytes(payload)) + } key := manifestListKey(art.Repository, art) log.Debugf("cache manifest list with key=cache:%v", key) if err := m.cache.Save(ctx, manifestListContentTypeKey(art.Repository, art), contentType, manifestListCacheInterval); err != nil {