blob: a578dea61758d88ee557f204966cb0bb573d91a4 [file] [log] [blame]
giolekva7be17df2020-03-21 13:57:02 +04001package client
2
giolekva1f6577a2020-03-25 12:53:06 +04003import (
4 "context"
5 "os"
giolekva7be17df2020-03-21 13:57:02 +04006
giolekva1f6577a2020-03-25 12:53:06 +04007 "pcloud/api"
8 "pcloud/chunk"
9)
giolekva7be17df2020-03-21 13:57:02 +040010
11type FileUploader struct {
giolekva1f6577a2020-03-25 12:53:06 +040012 client api.MetadataStorageClient
giolekva7be17df2020-03-21 13:57:02 +040013}
14
giolekva1f6577a2020-03-25 12:53:06 +040015func NewFileUploader(client api.MetadataStorageClient) *FileUploader {
16 return &FileUploader{client}
giolekva7be17df2020-03-21 13:57:02 +040017}
18
giolekvaadf6a342020-03-25 13:27:39 +040019func (fu *FileUploader) Upload(f *os.File, numReplicas int) {
giolekva1f6577a2020-03-25 12:53:06 +040020 info, err := f.Stat()
21 if err != nil {
22 return
giolekva7be17df2020-03-21 13:57:02 +040023 }
giolekva1f6577a2020-03-25 12:53:06 +040024 resp, err := fu.client.CreateBlob(
25 context.Background(), &api.CreateBlobRequest{
26 SizeBytes: int32(info.Size()),
giolekvaadf6a342020-03-25 13:27:39 +040027 NumReplicas: int32(numReplicas)})
giolekva1f6577a2020-03-25 12:53:06 +040028 if err != nil {
29 panic(err)
30 }
giolekvaadf6a342020-03-25 13:27:39 +040031 if len(resp.Chunk) != 1 {
32 panic(resp)
33 }
giolekva1f6577a2020-03-25 12:53:06 +040034 primaryListener := chunk.NewNonChangingPrimaryReplicaChangeListener(
35 resp.Chunk[0].ChunkId,
36 resp.Chunk[0].Server[0])
37 chunk.WriteToPrimary(
38 context.Background(),
39 chunk.NewReadOnlyFileChunk(f, 0, int(info.Size())),
40 primaryListener)
giolekva7be17df2020-03-21 13:57:02 +040041}