diff options
Diffstat (limited to 'weed/operation/lookup.go')
| -rw-r--r-- | weed/operation/lookup.go | 70 |
1 files changed, 19 insertions, 51 deletions
diff --git a/weed/operation/lookup.go b/weed/operation/lookup.go index ea68f8763..8717f6b36 100644 --- a/weed/operation/lookup.go +++ b/weed/operation/lookup.go @@ -2,17 +2,14 @@ package operation import ( "context" - "encoding/json" "errors" "fmt" "google.golang.org/grpc" "math/rand" - "net/url" "strings" "time" "github.com/chrislusf/seaweedfs/weed/pb/master_pb" - "github.com/chrislusf/seaweedfs/weed/util" ) type Location struct { @@ -20,63 +17,33 @@ type Location struct { PublicUrl string `json:"publicUrl,omitempty"` } type LookupResult struct { - VolumeId string `json:"volumeId,omitempty"` - Locations []Location `json:"locations,omitempty"` - Error string `json:"error,omitempty"` + VolumeOrFileId string `json:"volumeOrFileId,omitempty"` + Locations []Location `json:"locations,omitempty"` + Jwt string `json:"jwt,omitempty"` + Error string `json:"error,omitempty"` } func (lr *LookupResult) String() string { - return fmt.Sprintf("VolumeId:%s, Locations:%v, Error:%s", lr.VolumeId, lr.Locations, lr.Error) + return fmt.Sprintf("VolumeOrFileId:%s, Locations:%v, Error:%s", lr.VolumeOrFileId, lr.Locations, lr.Error) } var ( vc VidCache // caching of volume locations, re-check if after 10 minutes ) -func Lookup(masterFn GetMasterFn, vid string) (ret *LookupResult, err error) { - locations, cache_err := vc.Get(vid) - if cache_err != nil { - if ret, err = do_lookup(masterFn, vid); err == nil { - vc.Set(vid, ret.Locations, 10*time.Minute) - } - } else { - ret = &LookupResult{VolumeId: vid, Locations: locations} - } - return -} - -func do_lookup(masterFn GetMasterFn, vid string) (*LookupResult, error) { - values := make(url.Values) - values.Add("volumeId", vid) - server := masterFn() - jsonBlob, err := util.Post("http://"+server+"/dir/lookup", values) - if err != nil { - return nil, err - } - var ret LookupResult - err = json.Unmarshal(jsonBlob, &ret) - if err != nil { - return nil, err - } - if ret.Error != "" { - return nil, errors.New(ret.Error) - } - return &ret, nil -} - -func LookupFileId(masterFn GetMasterFn, fileId string) (fullUrl string, err error) { +func LookupFileId(masterFn GetMasterFn, grpcDialOption grpc.DialOption, fileId string) (fullUrl string, jwt string, err error) { parts := strings.Split(fileId, ",") if len(parts) != 2 { - return "", errors.New("Invalid fileId " + fileId) + return "", jwt, errors.New("Invalid fileId " + fileId) } - lookup, lookupError := Lookup(masterFn, parts[0]) + lookup, lookupError := LookupVolumeId(masterFn, grpcDialOption, parts[0]) if lookupError != nil { - return "", lookupError + return "", jwt, lookupError } if len(lookup.Locations) == 0 { - return "", errors.New("File Not Found") + return "", jwt, errors.New("File Not Found") } - return "http://" + lookup.Locations[rand.Intn(len(lookup.Locations))].Url + "/" + fileId, nil + return "http://" + lookup.Locations[rand.Intn(len(lookup.Locations))].Url + "/" + fileId, lookup.Jwt, nil } func LookupVolumeId(masterFn GetMasterFn, grpcDialOption grpc.DialOption, vid string) (*LookupResult, error) { @@ -93,7 +60,7 @@ func LookupVolumeIds(masterFn GetMasterFn, grpcDialOption grpc.DialOption, vids for _, vid := range vids { locations, cacheErr := vc.Get(vid) if cacheErr == nil { - ret[vid] = &LookupResult{VolumeId: vid, Locations: locations} + ret[vid] = &LookupResult{VolumeOrFileId: vid, Locations: locations} } else { unknown_vids = append(unknown_vids, vid) } @@ -108,7 +75,7 @@ func LookupVolumeIds(masterFn GetMasterFn, grpcDialOption grpc.DialOption, vids err := WithMasterServerClient(masterFn(), grpcDialOption, func(masterClient master_pb.SeaweedClient) error { req := &master_pb.LookupVolumeRequest{ - VolumeIds: unknown_vids, + VolumeOrFileIds: unknown_vids, } resp, grpcErr := masterClient.LookupVolume(context.Background(), req) if grpcErr != nil { @@ -125,12 +92,13 @@ func LookupVolumeIds(masterFn GetMasterFn, grpcDialOption grpc.DialOption, vids }) } if vidLocations.Error != "" { - vc.Set(vidLocations.VolumeId, locations, 10*time.Minute) + vc.Set(vidLocations.VolumeOrFileId, locations, 10*time.Minute) } - ret[vidLocations.VolumeId] = &LookupResult{ - VolumeId: vidLocations.VolumeId, - Locations: locations, - Error: vidLocations.Error, + ret[vidLocations.VolumeOrFileId] = &LookupResult{ + VolumeOrFileId: vidLocations.VolumeOrFileId, + Locations: locations, + Jwt: vidLocations.Auth, + Error: vidLocations.Error, } } |
