diff options
| author | zhangsong <zhangsong@cloudwalk.cn> | 2019-11-08 19:00:47 +0800 |
|---|---|---|
| committer | zhangsong <zhangsong@cloudwalk.cn> | 2019-11-08 20:27:55 +0800 |
| commit | 1dd101f78286c43d57a6a7732aee143b4ce6af6a (patch) | |
| tree | 0f4ea0439559b558d798c055fa1c4422593f0369 | |
| parent | 08c83b1a594f9270c75b1d42bc3bb583b38b2916 (diff) | |
| download | seaweedfs-1dd101f78286c43d57a6a7732aee143b4ce6af6a.tar.xz seaweedfs-1dd101f78286c43d57a6a7732aee143b4ce6af6a.zip | |
use read lock to avoid io hang during heartbeat
| -rw-r--r-- | weed/storage/store.go | 18 |
1 files 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 { |
