X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/ec0c244be178aed7af0cf990a256dda557034b68..76c2e8d11e3c644f1603adbef3222afaacd6a279:/sdk/go/keepclient/keepclient.go diff --git a/sdk/go/keepclient/keepclient.go b/sdk/go/keepclient/keepclient.go index cbfad8177d..54a4a374b9 100644 --- a/sdk/go/keepclient/keepclient.go +++ b/sdk/go/keepclient/keepclient.go @@ -21,7 +21,7 @@ import ( "time" "git.curoverse.com/arvados.git/sdk/go/arvadosclient" - "git.curoverse.com/arvados.git/sdk/go/streamer" + "git.curoverse.com/arvados.git/sdk/go/asyncbuf" ) // A Keep "block" is 64MB. @@ -156,10 +156,12 @@ func (kc *KeepClient) PutHR(hash string, r io.Reader, dataBytes int64) (string, bufsize = BLOCKSIZE } - t := streamer.AsyncStreamFromReader(bufsize, HashCheckingReader{r, md5.New(), hash}) - defer t.Close() - - return kc.putReplicas(hash, t, dataBytes) + buf := asyncbuf.NewBuffer(make([]byte, 0, bufsize)) + go func() { + _, err := io.Copy(buf, HashCheckingReader{r, md5.New(), hash}) + buf.CloseWithError(err) + }() + return kc.putReplicas(hash, buf.NewReader, dataBytes) } // PutHB writes a block to Keep. The hash of the bytes is given in @@ -167,9 +169,8 @@ func (kc *KeepClient) PutHR(hash string, r io.Reader, dataBytes int64) (string, // // Return values are the same as for PutHR. func (kc *KeepClient) PutHB(hash string, buf []byte) (string, int, error) { - t := streamer.AsyncStreamFromSlice(buf) - defer t.Close() - return kc.putReplicas(hash, t, int64(len(buf))) + newReader := func() io.Reader { return bytes.NewBuffer(buf) } + return kc.putReplicas(hash, newReader, int64(len(buf))) } // PutB writes a block to Keep. It computes the hash itself. @@ -292,6 +293,12 @@ func (kc *KeepClient) Get(locator string) (io.ReadCloser, int64, string, error) return kc.getOrHead("GET", locator) } +// ReadAt() retrieves a portion of block from the cache if it's +// present, otherwise from the network. +func (kc *KeepClient) ReadAt(locator string, p []byte, off int) (int, error) { + return kc.cache().ReadAt(kc, locator, p, off) +} + // Ask() verifies that a block with the given hash is available and // readable, according to at least one Keep service. Unlike Get, it // does not retrieve the data or verify that the data content matches