seaweedfs/weed/server/volume_grpc_remote.go

57 lines
1.8 KiB
Go
Raw Normal View History

2021-08-08 05:18:53 +08:00
package weed_server
import (
"context"
"fmt"
"github.com/chrislusf/seaweedfs/weed/pb/filer_pb"
"github.com/chrislusf/seaweedfs/weed/pb/volume_server_pb"
"github.com/chrislusf/seaweedfs/weed/remote_storage"
"github.com/chrislusf/seaweedfs/weed/storage/needle"
"github.com/chrislusf/seaweedfs/weed/storage/types"
)
func (vs *VolumeServer) FetchAndWriteNeedle(ctx context.Context, req *volume_server_pb.FetchAndWriteNeedleRequest) (resp *volume_server_pb.FetchAndWriteNeedleResponse, err error) {
resp = &volume_server_pb.FetchAndWriteNeedleResponse{}
v := vs.store.GetVolume(needle.VolumeId(req.VolumeId))
if v == nil {
return nil, fmt.Errorf("not found volume id %d", req.VolumeId)
}
remoteConf := &filer_pb.RemoteConf{
2021-08-09 13:30:36 +08:00
Type: req.RemoteType,
Name: req.RemoteName,
2021-08-08 05:18:53 +08:00
S3AccessKey: req.S3AccessKey,
S3SecretKey: req.S3SecretKey,
2021-08-09 13:30:36 +08:00
S3Region: req.S3Region,
S3Endpoint: req.S3Endpoint,
2021-08-08 05:18:53 +08:00
}
client, getClientErr := remote_storage.GetRemoteStorage(remoteConf)
2021-08-09 13:30:36 +08:00
if getClientErr != nil {
2021-08-08 05:18:53 +08:00
return nil, fmt.Errorf("get remote client: %v", getClientErr)
}
remoteStorageLocation := &filer_pb.RemoteStorageLocation{
Name: req.RemoteName,
Bucket: req.RemoteBucket,
2021-08-10 05:35:18 +08:00
Path: req.RemotePath,
2021-08-08 05:18:53 +08:00
}
data, ReadRemoteErr := client.ReadFile(remoteStorageLocation, req.Offset, req.Size)
if ReadRemoteErr != nil {
return nil, fmt.Errorf("read from remote %+v: %v", remoteStorageLocation, ReadRemoteErr)
}
2021-08-10 05:35:18 +08:00
n := new(needle.Needle)
n.Id = types.NeedleId(req.NeedleId)
n.Cookie = types.Cookie(req.Cookie)
n.Data, n.DataSize = data, uint32(len(data))
// copied from *Needle.prepareWriteBuffer()
n.Size = 4 + types.Size(n.DataSize) + 1
n.Checksum = needle.NewCRC(n.Data)
if _, err = vs.store.WriteVolumeNeedle(v.Id, n, true, false); err != nil {
2021-08-10 05:35:18 +08:00
return nil, fmt.Errorf("write needle %d size %d: %v", req.NeedleId, req.Size, err)
2021-08-08 05:18:53 +08:00
}
return resp, nil
}