From 4e58a4f24e6fe489b890c82d08e98a30b0bbc076 Mon Sep 17 00:00:00 2001 From: chenqieqie Date: Wed, 16 Dec 2020 18:49:10 +0800 Subject: [PATCH 1/2] fix race condition when loading volumes concurrently --- weed/storage/disk_location.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/weed/storage/disk_location.go b/weed/storage/disk_location.go index 2d4d120af..73d9d8111 100644 --- a/weed/storage/disk_location.go +++ b/weed/storage/disk_location.go @@ -99,10 +99,9 @@ func (l *DiskLocation) loadExistingVolume(fileInfo os.FileInfo, needleMapKind Ne } // avoid loading one volume more than once - l.volumesLock.RLock() - _, found := l.volumes[vid] - l.volumesLock.RUnlock() - if found { + l.volumesLock.Lock() + if _, found := l.volumes[vid]; found { + l.volumesLock.Unlock() glog.V(1).Infof("loaded volume, %v", vid) return true } @@ -110,11 +109,14 @@ func (l *DiskLocation) loadExistingVolume(fileInfo os.FileInfo, needleMapKind Ne // load the volume v, e := NewVolume(l.Directory, l.IdxDirectory, collection, vid, needleMapKind, nil, nil, 0, 0) if e != nil { + l.volumesLock.Unlock() glog.V(0).Infof("new volume %s error %s", volumeName, e) return false } - l.SetVolume(vid, v) + l.volumes[vid] = v + v.location = l + l.volumesLock.Unlock() size, _, _ := v.FileStat() glog.V(0).Infof("data file %s, replicaPlacement=%s v=%d size=%d ttl=%s", From 45f902a9b7abf907b31f43bb88d2b15e420cbac5 Mon Sep 17 00:00:00 2001 From: chenqieqie Date: Wed, 16 Dec 2020 20:23:51 +0800 Subject: [PATCH 2/2] smaller critical section --- weed/storage/disk_location.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/weed/storage/disk_location.go b/weed/storage/disk_location.go index 73d9d8111..359d0cec2 100644 --- a/weed/storage/disk_location.go +++ b/weed/storage/disk_location.go @@ -104,19 +104,19 @@ func (l *DiskLocation) loadExistingVolume(fileInfo os.FileInfo, needleMapKind Ne l.volumesLock.Unlock() glog.V(1).Infof("loaded volume, %v", vid) return true + } else { + l.volumes[vid] = nil + l.volumesLock.Unlock() } // load the volume v, e := NewVolume(l.Directory, l.IdxDirectory, collection, vid, needleMapKind, nil, nil, 0, 0) if e != nil { - l.volumesLock.Unlock() glog.V(0).Infof("new volume %s error %s", volumeName, e) return false } - - l.volumes[vid] = v - v.location = l - l.volumesLock.Unlock() + + l.SetVolume(vid, v) size, _, _ := v.FileStat() glog.V(0).Infof("data file %s, replicaPlacement=%s v=%d size=%d ttl=%s",