Move chunk/master data structures into libs
diff --git a/chunk/chunk.go b/chunk/chunk.go
deleted file mode 100644
index 1dde057..0000000
--- a/chunk/chunk.go
+++ /dev/null
@@ -1,76 +0,0 @@
-package main
-
-import "context"
-import "flag"
-import "fmt"
-import "log"
-import "net"
-import "time"
-
-import "google.golang.org/grpc"
-
-import pc "pcloud"
-
-var masterAddress string
-var selfAddress string
-
-func init() {
- flag.StringVar(&masterAddress, "master", "localhost:123", "Metadata storage address.")
- flag.StringVar(&selfAddress, "self", "", "Metadata storage address.")
-}
-
-type chunkStorage struct {
-}
-
-func (s *chunkStorage) ListChunks(
- ctx context.Context,
- request *pc.ListChunksRequest) (*pc.ListChunksResponse, error) {
- return nil, nil
-}
-
-func (s *chunkStorage) ReadChunk(
- ctx context.Context,
- request *pc.ReadChunkRequest) (*pc.ReadChunkResponse, error) {
- return nil, nil
-}
-
-func (s *chunkStorage) StoreChunk(
- ctx context.Context,
- request *pc.StoreChunkRequest) (*pc.StoreChunkResponse, error) {
- return nil, nil
-}
-
-func main() {
- flag.Parse()
- log.Print("Chunk server starting")
-
- // Create Master server client.
- var opts []grpc.DialOption
- opts = append(opts, grpc.WithInsecure())
- opts = append(opts, grpc.WithBlock())
- conn, err := grpc.Dial(masterAddress, opts...)
- if err != nil {
- log.Fatalf("Failed to dial %s: %v", masterAddress, err)
- }
- defer conn.Close()
- client := pc.NewMetadataStorageClient(conn)
-
- // Register current Chunk server with Master.
- ctx, _ := context.WithTimeout(context.Background(), 5*time.Second)
- _, err = client.AddChunkServer(
- ctx,
- &pc.AddChunkServerRequest{Address: selfAddress})
- if err != nil {
- log.Fatalf("failed to register chunk server: %v", err)
- }
- log.Print("Registered myself")
-
- // Start RPC server
- lis, err := net.Listen("tcp", fmt.Sprintf(":%d", 234))
- if err != nil {
- log.Fatalf("failed to listen: %v", err)
- }
- server := grpc.NewServer()
- pc.RegisterChunkStorageServer(server, &chunkStorage{})
- server.Serve(lis)
-}
diff --git a/chunk/server.go b/chunk/server.go
new file mode 100644
index 0000000..c35d761
--- /dev/null
+++ b/chunk/server.go
@@ -0,0 +1,41 @@
+package chunk
+
+import "context"
+import "sync"
+
+import "pcloud/api"
+
+type ChunkServer struct {
+ chunks sync.Map
+}
+
+func NewChunkServer() *ChunkServer {
+ return &ChunkServer{}
+}
+
+func (s *ChunkServer) ListChunks(
+ ctx context.Context,
+ request *api.ListChunksRequest) (*api.ListChunksResponse, error) {
+ resp := api.ListChunksResponse{}
+ s.chunks.Range(func(k, v interface{}) bool {
+ resp.ChunkId = append(resp.ChunkId, k.(string))
+ return true
+ })
+ return &resp, nil
+}
+
+func (s *ChunkServer) ReadChunk(
+ ctx context.Context,
+ request *api.ReadChunkRequest) (*api.ReadChunkResponse, error) {
+ if data, ok := s.chunks.Load(request.ChunkId); ok {
+ return &api.ReadChunkResponse{Data: data.([]byte)}, nil
+ }
+ return nil, nil
+}
+
+func (s *ChunkServer) StoreChunk(
+ ctx context.Context,
+ request *api.StoreChunkRequest) (*api.StoreChunkResponse, error) {
+ s.chunks.Store(request.ChunkId, request.Data)
+ return &api.StoreChunkResponse{}, nil
+}