Scale keep cache to 2*(openfiles+1).
authorTom Clegg <tom@tomclegg.ca>
Sat, 25 Sep 2021 13:44:22 +0000 (09:44 -0400)
committerTom Clegg <tom@tomclegg.ca>
Sat, 25 Sep 2021 13:47:46 +0000 (09:47 -0400)
refs #17966

Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tom@curii.com>

arvados.go

index c952a9870c77cab73c35237440555fb2b551ce23..d4dcf7819e5709db98cdfd675a5e0d5aed828a0e 100644 (file)
@@ -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()
 }