|
|
@ -1,7 +1,6 @@ |
|
|
|
package mount |
|
|
|
|
|
|
|
import ( |
|
|
|
"context" |
|
|
|
"fmt" |
|
|
|
"io" |
|
|
|
|
|
|
@ -9,19 +8,16 @@ import ( |
|
|
|
"github.com/seaweedfs/seaweedfs/weed/glog" |
|
|
|
"github.com/seaweedfs/seaweedfs/weed/operation" |
|
|
|
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb" |
|
|
|
"github.com/seaweedfs/seaweedfs/weed/security" |
|
|
|
"github.com/seaweedfs/seaweedfs/weed/util" |
|
|
|
) |
|
|
|
|
|
|
|
func (wfs *WFS) saveDataAsChunk(fullPath util.FullPath) filer.SaveDataAsChunkFunctionType { |
|
|
|
|
|
|
|
return func(reader io.Reader, filename string, offset int64) (chunk *filer_pb.FileChunk, err error) { |
|
|
|
var fileId, host string |
|
|
|
var auth security.EncodedJwt |
|
|
|
|
|
|
|
if err := wfs.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { |
|
|
|
return util.Retry("assignVolume", func() error { |
|
|
|
request := &filer_pb.AssignVolumeRequest{ |
|
|
|
fileId, uploadResult, err, data := operation.UploadWithRetry( |
|
|
|
wfs, |
|
|
|
&filer_pb.AssignVolumeRequest{ |
|
|
|
Count: 1, |
|
|
|
Replication: wfs.option.Replication, |
|
|
|
Collection: wfs.option.Collection, |
|
|
@ -29,47 +25,30 @@ func (wfs *WFS) saveDataAsChunk(fullPath util.FullPath) filer.SaveDataAsChunkFun |
|
|
|
DiskType: string(wfs.option.DiskType), |
|
|
|
DataCenter: wfs.option.DataCenter, |
|
|
|
Path: string(fullPath), |
|
|
|
} |
|
|
|
|
|
|
|
resp, err := client.AssignVolume(context.Background(), request) |
|
|
|
if err != nil { |
|
|
|
glog.V(0).Infof("assign volume failure %v: %v", request, err) |
|
|
|
return err |
|
|
|
} |
|
|
|
if resp.Error != "" { |
|
|
|
return fmt.Errorf("assign volume failure %v: %v", request, resp.Error) |
|
|
|
} |
|
|
|
|
|
|
|
fileId, auth = resp.FileId, security.EncodedJwt(resp.Auth) |
|
|
|
loc := resp.Location |
|
|
|
host = wfs.AdjustedUrl(loc) |
|
|
|
|
|
|
|
return nil |
|
|
|
}) |
|
|
|
}); err != nil { |
|
|
|
return nil, fmt.Errorf("filerGrpcAddress assign volume: %v", err) |
|
|
|
} |
|
|
|
|
|
|
|
fileUrl := fmt.Sprintf("http://%s/%s", host, fileId) |
|
|
|
if wfs.option.VolumeServerAccess == "filerProxy" { |
|
|
|
fileUrl = fmt.Sprintf("http://%s/?proxyChunkId=%s", wfs.getCurrentFiler(), fileId) |
|
|
|
} |
|
|
|
uploadOption := &operation.UploadOption{ |
|
|
|
UploadUrl: fileUrl, |
|
|
|
}, |
|
|
|
&operation.UploadOption{ |
|
|
|
Filename: filename, |
|
|
|
Cipher: wfs.option.Cipher, |
|
|
|
IsInputCompressed: false, |
|
|
|
MimeType: "", |
|
|
|
PairMap: nil, |
|
|
|
Jwt: auth, |
|
|
|
}, |
|
|
|
func(host, fileId string) string { |
|
|
|
fileUrl := fmt.Sprintf("http://%s/%s", host, fileId) |
|
|
|
if wfs.option.VolumeServerAccess == "filerProxy" { |
|
|
|
fileUrl = fmt.Sprintf("http://%s/?proxyChunkId=%s", wfs.getCurrentFiler(), fileId) |
|
|
|
} |
|
|
|
uploadResult, err, data := operation.Upload(reader, uploadOption) |
|
|
|
return fileUrl |
|
|
|
}, |
|
|
|
reader, |
|
|
|
) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
glog.V(0).Infof("upload data %v to %s: %v", filename, fileUrl, err) |
|
|
|
glog.V(0).Infof("upload data %v: %v", filename, err) |
|
|
|
return nil, fmt.Errorf("upload data: %v", err) |
|
|
|
} |
|
|
|
if uploadResult.Error != "" { |
|
|
|
glog.V(0).Infof("upload failure %v to %s: %v", filename, fileUrl, err) |
|
|
|
glog.V(0).Infof("upload failure %v: %v", filename, err) |
|
|
|
return nil, fmt.Errorf("upload result: %v", uploadResult.Error) |
|
|
|
} |
|
|
|
|
|
|
|