Skip to content

Commit

Permalink
fix: add retry on the caller of v2DeleteManifest instead within v2Del…
Browse files Browse the repository at this point in the history
…eteManifest

Signed-off-by: Shengwen Yu <yshengwen@vmware.com>
  • Loading branch information
zyyw committed May 10, 2023
1 parent 2958d7b commit 9af39ff
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 21 deletions.
13 changes: 12 additions & 1 deletion src/jobservice/job/impl/gc/garbage_collection.go
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,18 @@ func (gc *GarbageCollector) sweep(ctx job.Context) error {
// Harbor cannot know the existing tags in the backend from its database, so let the v2 DELETE manifest to remove all of them.
gc.logger.Infof("[%d/%d] delete the manifest with registry v2 API: %s, %s, %s",
idx, total, art.RepositoryName, blob.ContentType, blob.Digest)
if err := v2DeleteManifest(gc.logger, art.RepositoryName, blob.Digest); err != nil {
if err := retry.Retry(func() error {
return ignoreNotFound(func() error {
err := v2DeleteManifest(art.RepositoryName, blob.Digest)
// if the system is in read-only mode, return an Abort error to skip retrying
if err == readonly.Err {
return retry.Abort(err)
}
return err
})
}, retry.Callback(func(err error, sleep time.Duration) {
gc.logger.Infof("[%d/%d] failed to exec v2DeleteManifest, error: %v, will retry again after: %s", idx, total, err, sleep)
})); err != nil {
gc.logger.Errorf("[%d/%d] failed to delete manifest with v2 API, %s, %s, %v", idx, total, art.RepositoryName, blob.Digest, err)
if err := ignoreNotFound(func() error {
return gc.markDeleteFailed(ctx, blob)
Expand Down
22 changes: 2 additions & 20 deletions src/jobservice/job/impl/gc/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,10 @@ package gc

import (
"fmt"
"time"

"github.com/gomodule/redigo/redis"

"github.com/goharbor/harbor/src/jobservice/logger"
"github.com/goharbor/harbor/src/lib/errors"
"github.com/goharbor/harbor/src/lib/retry"
"github.com/goharbor/harbor/src/pkg/registry"
"github.com/goharbor/harbor/src/pkg/registry/interceptor/readonly"
)

// delKeys ...
Expand Down Expand Up @@ -60,7 +55,7 @@ func delKeys(con redis.Conn, pattern string) error {
}

// v2DeleteManifest calls the registry API to remove manifest
func v2DeleteManifest(logger logger.Interface, repository, digest string) error {
func v2DeleteManifest(repository, digest string) error {
exist, _, err := registry.Cli.ManifestExist(repository, digest)
if err != nil {
return err
Expand All @@ -70,20 +65,7 @@ func v2DeleteManifest(logger logger.Interface, repository, digest string) error
if !exist {
return nil
}
return retry.Retry(func() error {
err := registry.Cli.DeleteManifest(repository, digest)
// if the system is in read-only mode, return an Abort error to skip retrying
if err == readonly.Err {
return retry.Abort(err)
}
// If delete returned an err because the manifest is unknown, consider success
if errors.IsNotFoundErr(err) {
return nil
}
return err
}, retry.Callback(func(err error, sleep time.Duration) {
logger.Infof("failed to exec v2DeleteManifest, error: %v, will retry again after: %s", err, sleep)
}))
return registry.Cli.DeleteManifest(repository, digest)
}

// ignoreNotFound ignores the NotFoundErr error
Expand Down

0 comments on commit 9af39ff

Please sign in to comment.