Skip to content

Commit

Permalink
Fix issue related to redhat registry proxy cache
Browse files Browse the repository at this point in the history
  fixes #16495

Signed-off-by: stonezdj <[email protected]>
  • Loading branch information
stonezdj authored and stonezdj committed Nov 18, 2022
1 parent 39ca918 commit e16a087
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 16 deletions.
18 changes: 9 additions & 9 deletions src/controller/proxy/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
16 changes: 9 additions & 7 deletions src/controller/proxy/manifestcache.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}
Expand Down

0 comments on commit e16a087

Please sign in to comment.