21217: Fix "Authorization: OAuth2 ..." test to actually test that.
[arvados.git] / sdk / go / keepclient / block_cache.go
index c1138fab99fede7f223bfb290a7fa253e7cb66d2..89eecc6e276f843d2085b727193c0324ef8d4d03 100644 (file)
@@ -5,8 +5,11 @@
 package keepclient
 
 import (
+       "fmt"
        "io"
        "sort"
+       "strconv"
+       "strings"
        "sync"
        "time"
 )
@@ -51,21 +54,28 @@ func (c *BlockCache) Sweep() {
 
 // ReadAt returns data from the cache, first retrieving it from Keep if
 // necessary.
-func (c *BlockCache) ReadAt(kc *KeepClient, locator string, p []byte, off int64) (int, error) {
+func (c *BlockCache) ReadAt(kc *KeepClient, locator string, p []byte, off int) (int, error) {
        buf, err := c.Get(kc, locator)
        if err != nil {
                return 0, err
        }
-       if off > int64(len(buf)) {
+       if off > len(buf) {
                return 0, io.ErrUnexpectedEOF
        }
-       return copy(p, buf[int(off):]), nil
+       return copy(p, buf[off:]), nil
 }
 
 // Get returns data from the cache, first retrieving it from Keep if
 // necessary.
 func (c *BlockCache) Get(kc *KeepClient, locator string) ([]byte, error) {
        cacheKey := locator[:32]
+       bufsize := BLOCKSIZE
+       if parts := strings.SplitN(locator, "+", 3); len(parts) >= 2 {
+               datasize, err := strconv.ParseInt(parts[1], 10, 32)
+               if err == nil && datasize >= 0 {
+                       bufsize = int(datasize)
+               }
+       }
        c.mtx.Lock()
        if c.cache == nil {
                c.cache = make(map[string]*cacheBlock)
@@ -81,11 +91,14 @@ func (c *BlockCache) Get(kc *KeepClient, locator string) ([]byte, error) {
                        rdr, size, _, err := kc.Get(locator)
                        var data []byte
                        if err == nil {
-                               data = make([]byte, size, BLOCKSIZE)
+                               data = make([]byte, size, bufsize)
                                _, err = io.ReadFull(rdr, data)
                                err2 := rdr.Close()
-                               if err == nil {
-                                       err = err2
+                               if err == nil && err2 != nil {
+                                       err = fmt.Errorf("close(): %w", err2)
+                               }
+                               if err != nil {
+                                       err = fmt.Errorf("Get %s: %w", locator, err)
                                }
                        }
                        c.mtx.Lock()