Skip to content

Commit

Permalink
feat: add cached info
Browse files Browse the repository at this point in the history
add cached layer info in a conversion.eg. converted image xxx(cached 10/13)

Signed-off-by: YuQiang <y_q_email@163.com>
  • Loading branch information
PerseidMeteor committed Oct 24, 2023
1 parent 8ef0d01 commit 879220a
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 2 deletions.
36 changes: 36 additions & 0 deletions pkg/cache/cache.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ type RemoteCache struct {
records map[digest.Digest]*Item
// size is the cache record capacity of target layers.
size int
// newAdded records the number of new caches added in one conversion.
newAdded uint
}

func New(ctx context.Context, ref string, size int, pvd Provider) (context.Context, *RemoteCache) {
Expand Down Expand Up @@ -157,6 +159,9 @@ func Get(ctx context.Context, dgst digest.Digest) (*RemoteCache, *ocispec.Descri
func Set(ctx context.Context, source, target ocispec.Descriptor) {
rc, ok := ctx.Value(cacheKey{}).(*RemoteCache)
if ok {
if rc.get(source.Digest) == nil {
rc.newAdded++
}
rc.set(source, target)
}
}
Expand Down Expand Up @@ -456,3 +461,34 @@ func appendLayers(orgDescs, newDescs []ocispec.Descriptor, size int) []ocispec.D
}
return mergedLayers
}

// HitCount returns the hitted and total count of cache layers in a conversion.
func (rc *RemoteCache) HitCount(ctx context.Context, desc ocispec.Descriptor, platform platforms.MatchComparer) (uint, uint, error) {
maniDescs := []ocispec.Descriptor{}
switch desc.MediaType {
case ocispec.MediaTypeImageManifest, images.MediaTypeDockerSchema2Manifest:
maniDescs = append(maniDescs, desc)
case images.MediaTypeDockerSchema2ManifestList, ocispec.MediaTypeImageIndex:
descs, err := utils.GetManifests(ctx, rc.provider.ContentStore(), desc, platform)
if err != nil {
return 0, 0, err
}
maniDescs = append(maniDescs, descs...)
}
var cached, total uint
for _, maniDesc := range maniDescs {
manifest := ocispec.Manifest{}
_, err := utils.ReadJSON(ctx, rc.provider.ContentStore(), &manifest, maniDesc)
if err != nil {
return 0, 0, errors.Wrap(err, "read manifest")
}
total += uint(len(manifest.Layers))
for _, sourceLayer := range manifest.Layers {
if item := rc.get(sourceLayer.Digest); item != nil {
cached++
}
}
}
cached -= rc.newAdded
return cached, total, nil
}
28 changes: 26 additions & 2 deletions pkg/converter/converter.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import (
"github.com/containerd/containerd/platforms"
"github.com/containerd/containerd/reference/docker"
"github.com/goharbor/acceleration-service/pkg/adapter/annotation"
"github.com/goharbor/acceleration-service/pkg/cache"
"github.com/goharbor/acceleration-service/pkg/content"
"github.com/goharbor/acceleration-service/pkg/driver"
"github.com/goharbor/acceleration-service/pkg/errdefs"
Expand Down Expand Up @@ -142,7 +143,11 @@ func (cvt *Converter) Convert(ctx context.Context, source, target, cacheRef stri
if err := metric.SetSourceImageSize(ctx, cvt, source); err != nil {
return nil, errors.Wrap(err, "get source image size")
}
logger.Infof("pulled image %s, elapse %s", source, metric.SourcePullElapsed)
hitInfo, err := cvt.cacheHitInfo(ctx, source, cache)
if err != nil {
logger.Warnf("get cache hit count: %s", err.Error())
}
logger.Infof("pulled image %s %s, elapse %s", source, hitInfo, metric.SourcePullElapsed)

logger.Infof("converting image %s", source)
start = time.Now()
Expand All @@ -158,7 +163,11 @@ func (cvt *Converter) Convert(ctx context.Context, source, target, cacheRef stri
if err := metric.SetTargetImageSize(ctx, cvt, desc); err != nil {
return nil, errors.Wrap(err, "get target image size")
}
logger.Infof("converted image %s, elapse %s", target, metric.ConversionElapsed)
hitInfo, err = cvt.cacheHitInfo(ctx, source, cache)
if err != nil {
logger.Warnf("get cache hit count: %s", err.Error())
}
logger.Infof("converted image %s %s, elapse %s", target, hitInfo, metric.ConversionElapsed)

if cache != nil {
sourceImage, err := cvt.provider.Image(ctx, source)
Expand Down Expand Up @@ -190,3 +199,18 @@ func (cvt *Converter) Convert(ctx context.Context, source, target, cacheRef stri

return &metric, nil
}

func (cvt *Converter) cacheHitInfo(ctx context.Context, source string, cache *cache.RemoteCache) (string, error) {
if cache != nil {
sourceImage, err := cvt.provider.Image(ctx, source)
if err != nil {
return "", err
}
cached, total, err := cache.HitCount(ctx, *sourceImage, cvt.platformMC)
if err != nil {
return "", err
}
return fmt.Sprintf("(cached %d/%d)", cached, total), nil
}
return "", nil
}

0 comments on commit 879220a

Please sign in to comment.