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