From 4966a3abc75524a28a91359b65ab3b9ca3e2bdf4 Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev <9497591+kmlebedev@users.noreply.github.com> Date: Tue, 30 Aug 2022 01:23:02 +0500 Subject: [PATCH] avoid race conditions access to growRequestCount (#3537) https://github.com/seaweedfs/seaweedfs/issues/3511 --- weed/topology/volume_layout.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/weed/topology/volume_layout.go b/weed/topology/volume_layout.go index 8d28eff13..760cecbdd 100644 --- a/weed/topology/volume_layout.go +++ b/weed/topology/volume_layout.go @@ -6,6 +6,7 @@ import ( "github.com/seaweedfs/seaweedfs/weed/storage/types" "math/rand" "sync" + "sync/atomic" "time" "github.com/seaweedfs/seaweedfs/weed/glog" @@ -114,7 +115,7 @@ type VolumeLayout struct { volumeSizeLimit uint64 replicationAsMin bool accessLock sync.RWMutex - growRequestCount int + growRequestCount int32 growRequestTime time.Time } @@ -319,18 +320,19 @@ func (vl *VolumeLayout) PickForWrite(count uint64, option *VolumeGrowOption) (*n } func (vl *VolumeLayout) HasGrowRequest() bool { - if vl.growRequestCount > 0 && vl.growRequestTime.Add(time.Minute).After(time.Now()) { + if atomic.LoadInt32(&vl.growRequestCount) > 0 && + vl.growRequestTime.Add(time.Minute).After(time.Now()) { return true } return false } func (vl *VolumeLayout) AddGrowRequest() { vl.growRequestTime = time.Now() - vl.growRequestCount++ + atomic.AddInt32(&vl.growRequestCount, 1) } func (vl *VolumeLayout) DoneGrowRequest() { vl.growRequestTime = time.Unix(0, 0) - vl.growRequestCount = 0 + atomic.StoreInt32(&vl.growRequestCount, 0) } func (vl *VolumeLayout) ShouldGrowVolumes(option *VolumeGrowOption) bool {