From 8109f2021b86e95c8ba46bdc4d3c90e5bbab4de7 Mon Sep 17 00:00:00 2001 From: Konstantin Sykulev Date: Mon, 2 Jun 2025 20:07:15 -0500 Subject: [PATCH] Switched to DeleteObject for gcp interoperability (#29553) [28420](https://github.com/fleetdm/fleet/issues/28420) - [x] Changes file added for user-visible changes in `changes/`, `orbit/changes/` or `ee/fleetd-chrome/changes`. See [Changes files](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/guides/committing-changes.md#changes-files) for more information. --- .../28420-delete-object-gcp-interoperability | 1 + server/datastore/s3/common_file_store.go | 33 +++++++++++++++---- 2 files changed, 27 insertions(+), 7 deletions(-) create mode 100644 changes/28420-delete-object-gcp-interoperability diff --git a/changes/28420-delete-object-gcp-interoperability b/changes/28420-delete-object-gcp-interoperability new file mode 100644 index 0000000000..e939ab0e58 --- /dev/null +++ b/changes/28420-delete-object-gcp-interoperability @@ -0,0 +1 @@ +- Changed to using DeleteObject S3 api for GCP interoperability \ No newline at end of file diff --git a/server/datastore/s3/common_file_store.go b/server/datastore/s3/common_file_store.go index edd40d1661..15dd023cd2 100644 --- a/server/datastore/s3/common_file_store.go +++ b/server/datastore/s3/common_file_store.go @@ -6,6 +6,7 @@ import ( "io" "net/url" "path" + "sync/atomic" "time" "github.com/aws/aws-sdk-go-v2/feature/cloudfront/sign" @@ -13,6 +14,7 @@ import ( "github.com/aws/aws-sdk-go/service/s3" "github.com/fleetdm/fleet/v4/server/contexts/ctxerr" "github.com/fleetdm/fleet/v4/server/fleet" + "golang.org/x/sync/errgroup" ) const signedURLExpiresIn = 6 * time.Hour @@ -130,13 +132,30 @@ func (s *commonFileStore) Cleanup(ctx context.Context, usedFileIDs []string, rem return 0, nil } - res, err := s.s3client.DeleteObjects(&s3.DeleteObjectsInput{ - Bucket: &s.bucket, - Delete: &s3.Delete{ - Objects: toDeleteKeys, - }, - }) - return len(res.Deleted), ctxerr.Wrapf(ctx, err, "deleting %s in S3 store", s.fileLabel) + var deleted atomic.Int32 + var g errgroup.Group + g.SetLimit(10) + + for _, obj := range toDeleteKeys { + obj := obj + g.Go(func() error { + _, err := s.s3client.DeleteObject(&s3.DeleteObjectInput{ + Bucket: &s.bucket, + Key: obj.Key, + }) + if err != nil { + return ctxerr.Wrapf(ctx, err, "deleting %s in S3 store", s.fileLabel) + } + deleted.Add(1) + return nil + }) + } + + if err := g.Wait(); err != nil { + return int(deleted.Load()), ctxerr.Wrap(ctx, err, "errors occurred during S3 deletion") + } + + return int(deleted.Load()), ctxerr.Wrapf(ctx, err, "deleting %s in S3 store", s.fileLabel) } func (s *commonFileStore) Sign(ctx context.Context, fileID string) (string, error) {