From 1dd101f78286c43d57a6a7732aee143b4ce6af6a Mon Sep 17 00:00:00 2001 From: zhangsong Date: Fri, 8 Nov 2019 19:00:47 +0800 Subject: [PATCH] use read lock to avoid io hang during heartbeat --- weed/storage/store.go | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/weed/storage/store.go b/weed/storage/store.go index 66dd021ff..f115721cb 100644 --- a/weed/storage/store.go +++ b/weed/storage/store.go @@ -165,8 +165,9 @@ func (s *Store) CollectHeartbeat() *master_pb.Heartbeat { var maxFileKey NeedleId collectionVolumeSize := make(map[string]uint64) for _, location := range s.Locations { + var deleteVids []needle.VolumeId maxVolumeCount = maxVolumeCount + location.MaxVolumeCount - location.Lock() + location.RLock() for _, v := range location.volumes { if maxFileKey < v.MaxFileKey() { maxFileKey = v.MaxFileKey() @@ -175,8 +176,7 @@ func (s *Store) CollectHeartbeat() *master_pb.Heartbeat { volumeMessages = append(volumeMessages, v.ToVolumeInformationMessage()) } else { if v.expiredLongEnough(MAX_TTL_VOLUME_REMOVAL_DELAY) { - location.deleteVolumeById(v.Id) - glog.V(0).Infoln("volume", v.Id, "is deleted.") + deleteVids = append(deleteVids, v.Id) } else { glog.V(0).Infoln("volume", v.Id, "is expired.") } @@ -184,7 +184,17 @@ func (s *Store) CollectHeartbeat() *master_pb.Heartbeat { fileSize, _, _ := v.FileStat() collectionVolumeSize[v.Collection] += fileSize } - location.Unlock() + location.RUnlock() + + if len(deleteVids) > 0 { + // delete expired volumes. + location.Lock() + for _, vid := range deleteVids { + location.deleteVolumeById(vid) + glog.V(0).Infoln("volume", vid, "is deleted.") + } + location.Unlock() + } } for col, size := range collectionVolumeSize {