Fix issue related to redhat registry proxy cache (#17789)

fixes #16495

Signed-off-by: stonezdj <daojunz@vmware.com>
This commit is contained in:
stonezdj(Daojun Zhang) 2022-11-18 17:17:39 +08:00 committed by GitHub
parent ea812c9f16
commit 4b7d45513e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 16 deletions

View File

@ -170,31 +170,31 @@ func (c *controller) UseLocalManifest(ctx context.Context, art lib.ArtifactInfo,
return a != nil && string(desc.Digest) == a.Digest, nil, nil // digest matches
}
err = c.cache.Fetch(ctx, manifestListKey(art.Repository, string(desc.Digest)), &content)
err = c.cache.Fetch(ctx, manifestListKey(art.Repository, art), &content)
if err != nil {
if errors.Is(err, cache.ErrNotFound) {
log.Debugf("Digest is not found in manifest list cache, key=cache:%v", manifestListKey(art.Repository, string(desc.Digest)))
log.Debugf("Digest is not found in manifest list cache, key=cache:%v", manifestListKey(art.Repository, art))
} else {
log.Errorf("Failed to get manifest list from cache, error: %v", err)
}
return a != nil && string(desc.Digest) == a.Digest, nil, nil
}
err = c.cache.Fetch(ctx, manifestListContentTypeKey(art.Repository, string(desc.Digest)), &contentType)
err = c.cache.Fetch(ctx, manifestListContentTypeKey(art.Repository, art), &contentType)
if err != nil {
log.Debugf("failed to get the manifest list content type, not use local. error:%v", err)
return false, nil, nil
}
log.Debugf("Get the manifest list with key=cache:%v", manifestListKey(art.Repository, string(desc.Digest)))
log.Debugf("Get the manifest list with key=cache:%v", manifestListKey(art.Repository, art))
return true, &ManifestList{content, string(desc.Digest), contentType}, nil
}
func manifestListKey(repo, dig string) string {
// actual redis key format is cache:manifestlist:<repo name>:sha256:xxxx
return "manifestlist:" + repo + ":" + dig
func manifestListKey(repo string, art lib.ArtifactInfo) string {
// actual redis key format is cache:manifestlist:<repo name>:<tag> or cache:manifestlist:<repo name>:sha256:xxxx
return "manifestlist:" + repo + ":" + getReference(art)
}
func manifestListContentTypeKey(rep, dig string) string {
return manifestListKey(rep, dig) + ":contenttype"
func manifestListContentTypeKey(rep string, art lib.ArtifactInfo) string {
return manifestListKey(rep, art) + ":contenttype"
}
func (c *controller) ProxyManifest(ctx context.Context, art lib.ArtifactInfo, remote RemoteInterface) (distribution.Manifest, error) {

View File

@ -69,18 +69,20 @@ func (m *ManifestListCache) CacheContent(ctx context.Context, remoteRepo string,
log.Errorf("failed to get payload, error %v", err)
return
}
key := manifestListKey(art.Repository, art.Digest)
if len(getReference(art)) == 0 {
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
key := manifestListKey(art.Repository, art)
log.Debugf("cache manifest list with key=cache:%v", key)
err = m.cache.Save(ctx, manifestListContentTypeKey(art.Repository, art.Digest), contentType, manifestListCacheInterval)
if err != nil {
if err := m.cache.Save(ctx, manifestListContentTypeKey(art.Repository, art), contentType, manifestListCacheInterval); err != nil {
log.Errorf("failed to cache content type, error %v", err)
}
err = m.cache.Save(ctx, key, payload, manifestListCacheInterval)
if err != nil {
if err := m.cache.Save(ctx, key, payload, manifestListCacheInterval); err != nil {
log.Errorf("failed to cache payload, error %v", err)
}
err = m.push(ctx, art.Repository, getReference(art), man)
if err != nil {
if err := m.push(ctx, art.Repository, getReference(art), man); err != nil {
log.Errorf("error when push manifest list to local :%v", err)
}
}