X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/c3d4f8a585202ec58df5506934b698039c200b68..60e0be49f6fa0e24349635621acb4f7d273064d9:/sdk/go/keepclient/block_cache.go diff --git a/sdk/go/keepclient/block_cache.go b/sdk/go/keepclient/block_cache.go index 7d03b68b9c..5d8daad60d 100644 --- a/sdk/go/keepclient/block_cache.go +++ b/sdk/go/keepclient/block_cache.go @@ -1,7 +1,11 @@ +// Copyright (C) The Arvados Authors. All rights reserved. +// +// SPDX-License-Identifier: Apache-2.0 + package keepclient import ( - "io/ioutil" + "io" "sort" "sync" "time" @@ -25,7 +29,7 @@ const defaultMaxBlocks = 4 // there are no more than MaxBlocks left. func (c *BlockCache) Sweep() { max := c.MaxBlocks - if max < defaultMaxBlocks { + if max == 0 { max = defaultMaxBlocks } c.mtx.Lock() @@ -60,10 +64,15 @@ func (c *BlockCache) Get(kc *KeepClient, locator string) ([]byte, error) { } c.cache[cacheKey] = b go func() { - rdr, _, _, err := kc.Get(locator) + rdr, size, _, err := kc.Get(locator) var data []byte if err == nil { - data, err = ioutil.ReadAll(rdr) + data = make([]byte, size, BLOCKSIZE) + _, err = io.ReadFull(rdr, data) + err2 := rdr.Close() + if err == nil { + err = err2 + } } c.mtx.Lock() b.data, b.err = data, err @@ -85,7 +94,13 @@ func (c *BlockCache) Get(kc *KeepClient, locator string) ([]byte, error) { } func (c *BlockCache) setup() { + c.mtx.Lock() c.cache = make(map[string]*cacheBlock) + c.mtx.Unlock() +} + +func (c *BlockCache) Clear() { + c.setup() } type timeSlice []time.Time