From 1b6d32146cfdbf4c5befbfc5ddd1651d6c63c735 Mon Sep 17 00:00:00 2001 From: Tom Clegg Date: Sat, 25 Sep 2021 09:44:22 -0400 Subject: [PATCH] Scale keep cache to 2*(openfiles+1). refs #17966 Arvados-DCO-1.1-Signed-off-by: Tom Clegg --- arvados.go | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/arvados.go b/arvados.go index c952a9870c..d4dcf7819e 100644 --- a/arvados.go +++ b/arvados.go @@ -520,6 +520,7 @@ var ( type file interface { io.ReadCloser + io.Seeker Readdir(n int) ([]os.FileInfo, error) } @@ -552,9 +553,23 @@ func open(fnm string) (file, error) { keepClient.BlockCache = &keepclient.BlockCache{MaxBlocks: 4} siteFS = arvadosClientFromEnv.SiteFileSystem(keepClient) } else { - keepClient.BlockCache.MaxBlocks++ + keepClient.BlockCache.MaxBlocks += 2 } log.Infof("reading %q from %s using Arvados client", fnm[len(mnt):], uuid) - return siteFS.Open("by_id/" + uuid + fnm[len(mnt):]) + f, err := siteFS.Open("by_id/" + uuid + fnm[len(mnt):]) + if err != nil { + return nil, err + } + return &reduceCacheOnClose{file: f}, nil +} + +type reduceCacheOnClose struct { + file + once sync.Once +} + +func (rc *reduceCacheOnClose) Close() error { + rc.once.Do(func() { keepClient.BlockCache.MaxBlocks -= 2 }) + return rc.file.Close() } -- 2.30.2