From 9f3f2f7c79d7c88e211566af99640bb3eb3186da Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 28 Jun 2019 09:47:29 -0700 Subject: [PATCH] protect locations slice fix https://github.com/chrislusf/seaweedfs/issues/995 --- weed/wdclient/vid_map.go | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/weed/wdclient/vid_map.go b/weed/wdclient/vid_map.go index 2556049c3..4c43a225a 100644 --- a/weed/wdclient/vid_map.go +++ b/weed/wdclient/vid_map.go @@ -37,12 +37,7 @@ func (vc *vidMap) LookupVolumeServerUrl(vid string) (serverUrl string, err error return "", err } - locations := vc.GetLocations(uint32(id)) - if len(locations) == 0 { - return "", fmt.Errorf("volume %d not found", id) - } - - return locations[vc.r.Intn(len(locations))].Url, nil + return vc.GetRandomLocation(uint32(id)) } func (vc *vidMap) LookupFileId(fileId string) (fullUrl string, err error) { @@ -85,6 +80,18 @@ func (vc *vidMap) GetLocations(vid uint32) (locations []Location) { return vc.vid2Locations[vid] } +func (vc *vidMap) GetRandomLocation(vid uint32) (serverUrl string, err error) { + vc.RLock() + defer vc.RUnlock() + + locations := vc.vid2Locations[vid] + if len(locations) == 0 { + return "", fmt.Errorf("volume %d not found", id) + } + + return locations[vc.r.Intn(len(locations))].Url, nil +} + func (vc *vidMap) addLocation(vid uint32, location Location) { vc.Lock() defer vc.Unlock()