aboutsummaryrefslogtreecommitdiff
path: root/weed/operation/lookup_vid_cache.go
diff options
context:
space:
mode:
Diffstat (limited to 'weed/operation/lookup_vid_cache.go')
-rw-r--r--weed/operation/lookup_vid_cache.go51
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)
+ }
+}