// ShardReader returns a reader for streaming shard data. // Returned ReadCloser must be closed by the caller. func (c *Client) ShardReader(id uint64) (io.ReadCloser, error) { // Connect to remote server. conn, err := tcp.Dial("tcp", c.host, MuxHeader) if err != nil { return nil, err } // Send request to server. if err := c.writeRequest(conn, &internal.Request{ShardID: proto.Uint64(id)}); err != nil { return nil, fmt.Errorf("write request: %s", err) } // Read response from the server. resp, err := c.readResponse(conn) if err != nil { return nil, fmt.Errorf("read response: %s", err) } // If there was an error then return it and close connection. if resp.GetError() != "" { conn.Close() return nil, errors.New(resp.GetError()) } // Returning remaining stream for caller to consume. return conn, nil }
// download downloads a snapshot of either the metastore or a shard from a host to a given path. func (cmd *Command) download(req *snapshotter.Request, path string) error { // Create local file to write to. f, err := os.Create(path) if err != nil { return fmt.Errorf("open temp file: %s", err) } defer f.Close() // Connect to snapshotter service. conn, err := tcp.Dial("tcp", cmd.host, snapshotter.MuxHeader) if err != nil { return err } defer conn.Close() // Write the request if err := json.NewEncoder(conn).Encode(req); err != nil { return fmt.Errorf("encode snapshot request: %s", err) } // Read snapshot from the connection if _, err := io.Copy(f, conn); err != nil { return fmt.Errorf("copy backup to file: %s", err) } return nil }
// requestInfo will request the database or retention policy information from the host func (cmd *Command) requestInfo(request *snapshotter.Request) (*snapshotter.Response, error) { // Connect to snapshotter service. conn, err := tcp.Dial("tcp", cmd.host, snapshotter.MuxHeader) if err != nil { return nil, err } defer conn.Close() // Write the request if err := json.NewEncoder(conn).Encode(request); err != nil { return nil, fmt.Errorf("encode snapshot request: %s", err) } // Read the response var r snapshotter.Response if err := json.NewDecoder(conn).Decode(&r); err != nil { return nil, err } return &r, nil }