Commit d3e89f16 authored by Alexander Narsudinov's avatar Alexander Narsudinov
Browse files

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.
parent da3638eb
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -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)