Add caching volume locations to batch volume id lookup.

This commit is contained in:
Chris Lu 2015-01-11 23:01:31 -08:00
parent 2495ce6707
commit 352ef2830c

View file

@ -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
} }