Basic file uploader implemetation. Does not wait for replication to finish.
diff --git a/chunk/remote.go b/chunk/remote.go
index 1cb57f1..0da0ad8 100644
--- a/chunk/remote.go
+++ b/chunk/remote.go
@@ -2,7 +2,6 @@
import (
"context"
- "errors"
"io"
"pcloud/api"
@@ -13,48 +12,63 @@
client api.ChunkStorageClient
}
-func (r *RemoteChunk) SizeBytes() int {
- return 0
+func (r *RemoteChunk) Stats() (info ChunkInfo, err error) {
+ resp, err := r.client.GetChunkStatus(
+ context.Background(),
+ &api.GetChunkStatusRequest{ChunkId: r.chunkId})
+ if err != nil {
+ return
+ }
+ info = ChunkInfo{
+ resp.Status,
+ int(resp.TotalBytes),
+ int(resp.CommittedBytes)}
+ return
}
-func (r *RemoteChunk) ReadSeeker() io.ReadSeeker {
- return &remoteChunkReadSeeker{
+func (r *RemoteChunk) ReaderAt() io.ReaderAt {
+ return &remoteChunkReaderAt{
chunkId: r.chunkId,
client: r.client}
}
-func (r *RemoteChunk) Writer() io.Writer {
- return nil
+func (r *RemoteChunk) WriterAt() io.WriterAt {
+ return &remoteChunkWriterAt{
+ chunkId: r.chunkId,
+ client: r.client}
}
-type remoteChunkReadSeeker struct {
+type remoteChunkReaderAt struct {
chunkId string
client api.ChunkStorageClient
- offset int64
}
-func (c *remoteChunkReadSeeker) Seek(offset int64, whence int) (int64, error) {
- if whence != io.SeekStart {
- return 0, errors.New("Seek: RemoteChunk only supports SeekStart whence")
- }
- c.offset = offset
- return offset, nil
-}
-
-func (c *remoteChunkReadSeeker) Read(p []byte) (n int, err error) {
+func (c *remoteChunkReaderAt) ReadAt(p []byte, offset int64) (n int, err error) {
req := api.ReadChunkRequest{
ChunkId: c.chunkId,
- Offset: int32(c.offset), // TODO(lekva): must be int64
+ Offset: int32(offset),
NumBytes: int32(len(p))}
resp, err := c.client.ReadChunk(context.Background(), &req)
if err != nil {
return
}
n = copy(p, resp.Data)
- c.offset += int64(n)
return
}
-type PrimaryReplicaChunk struct {
+type remoteChunkWriterAt struct {
chunkId string
+ client api.ChunkStorageClient
+}
+
+func (c *remoteChunkWriterAt) WriteAt(p []byte, offset int64) (n int, err error) {
+ req := api.WriteChunkRequest{
+ ChunkId: c.chunkId,
+ Offset: int32(offset),
+ Data: p}
+ resp, err := c.client.WriteChunk(context.Background(), &req)
+ if resp != nil {
+ n = int(resp.BytesWritten)
+ }
+ return
}