mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2024-01-19 02:48:24 +00:00
Add caching volume locations to batch volume id lookup.
This commit is contained in:
parent
2495ce6707
commit
352ef2830c
|
@ -27,14 +27,14 @@ func (lr *LookupResult) String() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
vc VidCache
|
vc VidCache // caching of volume locations, re-check if after 10 minutes
|
||||||
)
|
)
|
||||||
|
|
||||||
func Lookup(server string, vid string) (ret *LookupResult, err error) {
|
func Lookup(server string, vid string) (ret *LookupResult, err error) {
|
||||||
locations, cache_err := vc.Get(vid)
|
locations, cache_err := vc.Get(vid)
|
||||||
if cache_err != nil {
|
if cache_err != nil {
|
||||||
if ret, err = do_lookup(server, vid); err == nil {
|
if ret, err = do_lookup(server, vid); err == nil {
|
||||||
vc.Set(vid, ret.Locations, 1*time.Minute)
|
vc.Set(vid, ret.Locations, 10*time.Minute)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ret = &LookupResult{VolumeId: vid, Locations: locations}
|
ret = &LookupResult{VolumeId: vid, Locations: locations}
|
||||||
|
@ -75,19 +75,44 @@ func LookupFileId(server string, fileId string) (fullUrl string, err error) {
|
||||||
return "http://" + lookup.Locations[rand.Intn(len(lookup.Locations))].PublicUrl + "/" + fileId, nil
|
return "http://" + lookup.Locations[rand.Intn(len(lookup.Locations))].PublicUrl + "/" + fileId, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LookupVolumeIds find volume locations by cache and actual lookup
|
||||||
func LookupVolumeIds(server string, vids []string) (map[string]LookupResult, error) {
|
func LookupVolumeIds(server string, vids []string) (map[string]LookupResult, error) {
|
||||||
values := make(url.Values)
|
ret := make(map[string]LookupResult)
|
||||||
|
var unknown_vids []string
|
||||||
|
|
||||||
|
//check vid cache first
|
||||||
for _, vid := range vids {
|
for _, vid := range vids {
|
||||||
|
locations, cache_err := vc.Get(vid)
|
||||||
|
if cache_err == nil {
|
||||||
|
ret[vid] = LookupResult{VolumeId: vid, Locations: locations}
|
||||||
|
} else {
|
||||||
|
unknown_vids = append(unknown_vids, vid)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//return success if all volume ids are known
|
||||||
|
if len(unknown_vids) == 0 {
|
||||||
|
return ret, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
//only query unknown_vids
|
||||||
|
values := make(url.Values)
|
||||||
|
for _, vid := range unknown_vids {
|
||||||
values.Add("volumeId", vid)
|
values.Add("volumeId", vid)
|
||||||
}
|
}
|
||||||
jsonBlob, err := util.Post("http://"+server+"/vol/lookup", values)
|
jsonBlob, err := util.Post("http://"+server+"/vol/lookup", values)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
ret := make(map[string]LookupResult)
|
|
||||||
err = json.Unmarshal(jsonBlob, &ret)
|
err = json.Unmarshal(jsonBlob, &ret)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.New(err.Error() + " " + string(jsonBlob))
|
return nil, errors.New(err.Error() + " " + string(jsonBlob))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//set newly checked vids to cache
|
||||||
|
for _, vid := range unknown_vids {
|
||||||
|
locations := ret[vid].Locations
|
||||||
|
vc.Set(vid, locations, 10*time.Minute)
|
||||||
|
}
|
||||||
|
|
||||||
return ret, nil
|
return ret, nil
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue