Skip to content

Commit

Permalink
remove layer's link file by gc
Browse files Browse the repository at this point in the history
The garbage-collect should remove unsed layer link file

P.S. This was originally contributed by @m-masataka, now I would like to take over it.
Thanks @m-masataka efforts with PR #2288

Signed-off-by: Liang Zheng <zhengliang0901@gmail.com>
  • Loading branch information
microyahoo committed May 8, 2024
1 parent c49220d commit 33a08b8
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 7 deletions.
41 changes: 34 additions & 7 deletions registry/storage/garbagecollect.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ func MarkAndSweep(ctx context.Context, storageDriver driver.StorageDriver, regis

// mark
markSet := make(map[digest.Digest]struct{})
deleteLayerSet := make(map[string][]digest.Digest)
manifestArr := make([]ManifestDel, 0)
err := repositoryEnumerator.Enumerate(ctx, func(repoName string) error {
emit(repoName)
Expand Down Expand Up @@ -97,15 +98,32 @@ func MarkAndSweep(ctx context.Context, storageDriver driver.StorageDriver, regis
})
})

// In certain situations such as unfinished uploads, deleting all
// tags in S3 or removing the _manifests folder manually, this
// error may be of type PathNotFound.
//
// In these cases we can continue marking other manifests safely.
if _, ok := err.(driver.PathNotFoundError); ok {
return nil
if err != nil {
// In certain situations such as unfinished uploads, deleting all
// tags in S3 or removing the _manifests folder manually, this
// error may be of type PathNotFound.
//
// In these cases we can continue marking other manifests safely.
if _, ok := err.(driver.PathNotFoundError); !ok {
return err
}
}
blobService := repository.Blobs(ctx)
layerEnumerator, ok := blobService.(distribution.ManifestEnumerator)
if !ok {
return fmt.Errorf("unable to convert BlobService into ManifestEnumerator")
}

var deleteLayers []digest.Digest
err = layerEnumerator.Enumerate(ctx, func(dgst digest.Digest) error {
if _, ok := markSet[dgst]; !ok {
deleteLayers = append(deleteLayers, dgst)
}
return nil
})
if len(deleteLayers) > 0 {
deleteLayerSet[repoName] = deleteLayers
}
return err
})
if err != nil {
Expand Down Expand Up @@ -148,6 +166,15 @@ func MarkAndSweep(ctx context.Context, storageDriver driver.StorageDriver, regis
}
}

for repo, dgsts := range deleteLayerSet {
for _, dgst := range dgsts {
err = vacuum.RemoveLayer(repo, dgst)
if err != nil {
return fmt.Errorf("failed to delete layer link %s of repo %s: %v", dgst, repo, err)
}
}
}

return err
}

Expand Down
15 changes: 15 additions & 0 deletions registry/storage/vacuum.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,3 +100,18 @@ func (v Vacuum) RemoveRepository(repoName string) error {

return nil
}

// RemoveLayer removes a layer link path from the storage
func (v Vacuum) RemoveLayer(repoName string, dgest digest.Digest) error {
layerLinkPath, err := pathFor(layerLinkPathSpec{name: repoName, digest: dgest})
if err != nil {
return err
}
dcontext.GetLogger(v.ctx).Infof("Deleting layer link path: %s", layerLinkPath)
err = v.driver.Delete(v.ctx, layerLinkPath)
if err != nil {
return err
}

return nil
}

0 comments on commit 33a08b8

Please sign in to comment.