From d3e89f164bf8a1c8f6bc788c42581349ac4618ac Mon Sep 17 00:00:00 2001 From: Alexander Narsudinov Date: Fri, 27 Oct 2023 20:05:02 +0200 Subject: [PATCH] Use atomics to make writing of results safe in `removeObjectsOneByOne` Previous implementation didn't have any synchronization mechanism for goroutines that does the work. There are multiple approaches to make it work correctly, let's start with the simplest - atomics. --- pkg/s3/client.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pkg/s3/client.go b/pkg/s3/client.go index 563c033..6e63e6d 100644 --- a/pkg/s3/client.go +++ b/pkg/s3/client.go @@ -5,6 +5,7 @@ import ( "context" "fmt" "net/url" + "sync/atomic" "github.com/golang/glog" "github.com/minio/minio-go/v7" @@ -173,8 +174,8 @@ func (client *s3Client) removeObjectsOneByOne(bucketName, prefix string) error { objectsCh := make(chan minio.ObjectInfo, 1) guardCh := make(chan int, parallelism) var listErr error - totalObjects := 0 - removeErrors := 0 + var totalObjects int64 = 0 + var removeErrors int64 = 0 go func() { defer close(objectsCh) @@ -185,7 +186,7 @@ func (client *s3Client) removeObjectsOneByOne(bucketName, prefix string) error { listErr = object.Err return } - totalObjects++ + atomic.AddInt64(&totalObjects, 1) objectsCh <- object } }() @@ -202,7 +203,7 @@ func (client *s3Client) removeObjectsOneByOne(bucketName, prefix string) error { minio.RemoveObjectOptions{VersionID: obj.VersionID}) if err != nil { glog.Errorf("Failed to remove object %s, error: %s", obj.Key, err) - removeErrors++ + atomic.AddInt64(&removeErrors, 1) } <- guardCh }(object)