Skip to content

Commit

Permalink
Improve context propagation to cleaner (#81)
Browse files Browse the repository at this point in the history
This ensures that the cancellation context is propagated throughout the
stack. If the user presses CTRL+C on the CLI or if an HTTP request is
cancelled, the processing will terminate faster.
  • Loading branch information
sethvargo committed Apr 12, 2022
1 parent 5d0fb9c commit b04eb28
Show file tree
Hide file tree
Showing 5 changed files with 19 additions and 15 deletions.
4 changes: 2 additions & 2 deletions cmd/gcr-cleaner-cli/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ func realMain(ctx context.Context, logger *gcrcleaner.Logger) error {
}
since := time.Now().UTC().Add(sub)

// Gather the repositories
// Gather the repositories.
if *recursivePtr {
logger.Debug("gathering child repositories recursively")
for _, repo := range repos {
Expand All @@ -181,7 +181,7 @@ func realMain(ctx context.Context, logger *gcrcleaner.Logger) error {
var result *multierror.Error
for i, repo := range repos {
fmt.Fprintf(stdout, "%s\n", repo)
deleted, err := cleaner.Clean(repo, since, *keepPtr, tagFilter, *dryRunPtr)
deleted, err := cleaner.Clean(ctx, repo, since, *keepPtr, tagFilter, *dryRunPtr)
if err != nil {
result = multierror.Append(result, err)
}
Expand Down
4 changes: 2 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@ require (
github.com/opencontainers/image-spec v1.0.2 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/sirupsen/logrus v1.8.1 // indirect
golang.org/x/net v0.0.0-20220325170049-de3da57026de // indirect
golang.org/x/net v0.0.0-20220407224826-aac1ed45d8e3 // indirect
golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a // indirect
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f // indirect
golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/protobuf v1.28.0 // indirect
)
8 changes: 4 additions & 4 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -904,8 +904,8 @@ golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qx
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/net v0.0.0-20220325170049-de3da57026de h1:pZB1TWnKi+o4bENlbzAgLrEbY4RMYmUIRobMcSmfeYc=
golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/net v0.0.0-20220407224826-aac1ed45d8e3 h1:EN5+DfgmRMvRUrMGERW2gQl3Vc+Z7ZMnI/xdEpPSf0c=
golang.org/x/net v0.0.0-20220407224826-aac1ed45d8e3/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
Expand Down Expand Up @@ -1041,8 +1041,8 @@ golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f h1:rlezHXNlxYWvBCzNses9Dlc7nGFaNMJeqLolcmQSSZY=
golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f h1:8w7RhxzTVgUzw/AH/9mUV5q0vMgy40SQRursCcfmkCw=
golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
Expand Down
16 changes: 10 additions & 6 deletions pkg/gcrcleaner/cleaner.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,14 +50,16 @@ func NewCleaner(auther gcrauthn.Authenticator, logger *Logger, c int) (*Cleaner,

// Clean deletes old images from GCR that are (un)tagged and older than "since"
// and higher than the "keep" amount.
func (c *Cleaner) Clean(repo string, since time.Time, keep int, tagFilter TagFilter, dryRun bool) ([]string, error) {
func (c *Cleaner) Clean(ctx context.Context, repo string, since time.Time, keep int, tagFilter TagFilter, dryRun bool) ([]string, error) {
gcrrepo, err := gcrname.NewRepository(repo)
if err != nil {
return nil, fmt.Errorf("failed to get repo %s: %w", repo, err)
}
c.logger.Debug("computed repo", "repo", gcrrepo.Name())

tags, err := gcrgoogle.List(gcrrepo, gcrgoogle.WithAuth(c.auther))
tags, err := gcrgoogle.List(gcrrepo,
gcrgoogle.WithContext(ctx),
gcrgoogle.WithAuth(c.auther))
if err != nil {
return nil, fmt.Errorf("failed to list tags for repo %s: %w", repo, err)
}
Expand Down Expand Up @@ -113,7 +115,7 @@ func (c *Cleaner) Clean(repo string, since time.Time, keep int, tagFilter TagFil

tagged := gcrrepo.Tag(tag)
if !dryRun {
if err := c.deleteOne(tagged); err != nil {
if err := c.deleteOne(ctx, tagged); err != nil {
return nil, fmt.Errorf("failed to delete %s: %w", tagged, err)
}
}
Expand All @@ -140,7 +142,7 @@ func (c *Cleaner) Clean(repo string, since time.Time, keep int, tagFilter TagFil
"digest", m.Digest)

if !dryRun {
if err := c.deleteOne(ref); err != nil {
if err := c.deleteOne(ctx, ref); err != nil {
cause := errors.Unwrap(err).Error()

errsLock.Lock()
Expand Down Expand Up @@ -190,8 +192,10 @@ type manifest struct {
}

// deleteOne deletes a single repo ref using the supplied auth.
func (c *Cleaner) deleteOne(ref gcrname.Reference) error {
if err := gcrremote.Delete(ref, gcrremote.WithAuth(c.auther)); err != nil {
func (c *Cleaner) deleteOne(ctx context.Context, ref gcrname.Reference) error {
if err := gcrremote.Delete(ref,
gcrremote.WithAuth(c.auther),
gcrremote.WithContext(ctx)); err != nil {
return fmt.Errorf("failed to delete %s: %w", ref, err)
}

Expand Down
2 changes: 1 addition & 1 deletion pkg/gcrcleaner/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ func (s *Server) clean(ctx context.Context, r io.ReadCloser) (map[string][]strin
for _, repo := range repos {
s.logger.Info("deleting refs for repo", "repo", repo)

childrenDeleted, err := s.cleaner.Clean(repo, since, p.Keep, tagFilter, p.DryRun)
childrenDeleted, err := s.cleaner.Clean(ctx, repo, since, p.Keep, tagFilter, p.DryRun)
if err != nil {
return nil, http.StatusBadRequest, fmt.Errorf("failed to clean repo %q: %w", repo, err)
}
Expand Down

0 comments on commit b04eb28

Please sign in to comment.