diff options
Diffstat (limited to 'weed/operation/lookup_vid_cache.go')
| -rw-r--r-- | weed/operation/lookup_vid_cache.go | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/weed/operation/lookup_vid_cache.go b/weed/operation/lookup_vid_cache.go new file mode 100644 index 000000000..1ed03613d --- /dev/null +++ b/weed/operation/lookup_vid_cache.go @@ -0,0 +1,51 @@ +package operation + +import ( + "errors" + "strconv" + "time" + + "github.com/chrislusf/seaweedfs/weed/glog" +) + +type VidInfo struct { + Locations []Location + NextRefreshTime time.Time +} +type VidCache struct { + cache []VidInfo +} + +func (vc *VidCache) Get(vid string) ([]Location, error) { + id, err := strconv.Atoi(vid) + if err != nil { + glog.V(1).Infof("Unknown volume id %s", vid) + return nil, err + } + if 0 < id && id <= len(vc.cache) { + if vc.cache[id-1].Locations == nil { + return nil, errors.New("Not Set") + } + if vc.cache[id-1].NextRefreshTime.Before(time.Now()) { + return nil, errors.New("Expired") + } + return vc.cache[id-1].Locations, nil + } + return nil, errors.New("Not Found") +} +func (vc *VidCache) Set(vid string, locations []Location, duration time.Duration) { + id, err := strconv.Atoi(vid) + if err != nil { + glog.V(1).Infof("Unknown volume id %s", vid) + return + } + if id > len(vc.cache) { + for i := id - len(vc.cache); i > 0; i-- { + vc.cache = append(vc.cache, VidInfo{}) + } + } + if id > 0 { + vc.cache[id-1].Locations = locations + vc.cache[id-1].NextRefreshTime = time.Now().Add(duration) + } +} |
