19428: Tidy up pruneSessions, avoid calling MemorySize 2x. 19428-webdav-performance
authorTom Clegg <tom@curii.com>
Fri, 2 Sep 2022 14:28:52 +0000 (10:28 -0400)
committerTom Clegg <tom@curii.com>
Fri, 2 Sep 2022 14:28:52 +0000 (10:28 -0400)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tom@curii.com>

services/keep-web/cache.go

index b08abad85d4290bf939d2ee9a1029cf9a9f7d464..7ec8639abaa2cf1f99b22dd8d37cbb787475bcfe 100644 (file)
@@ -274,9 +274,10 @@ func (c *cache) GetSession(token string) (arvados.CustomFileSystem, *cachedSessi
 // until approximate remaining size <= maxsize/2
 func (c *cache) pruneSessions() {
        now := time.Now()
-       var size int64
        keys := c.sessions.Keys()
-       for idx, token := range keys {
+       sizes := make([]int64, len(keys))
+       var size int64
+       for i, token := range keys {
                ent, ok := c.sessions.Peek(token)
                if !ok {
                        continue
@@ -284,37 +285,20 @@ func (c *cache) pruneSessions() {
                s := ent.(*cachedSession)
                if s.expire.Before(now) {
                        c.sessions.Remove(token)
-                       keys[idx] = ""
                        continue
                }
                if fs, ok := s.fs.Load().(arvados.CustomFileSystem); ok {
-                       size += fs.MemorySize()
+                       sizes[i] = fs.MemorySize()
+                       size += sizes[i]
                }
        }
        // Remove tokens until reaching size limit, starting with the
        // least frequently used entries (which Keys() returns last).
-       for i := len(keys) - 1; i >= 0; i-- {
-               token := keys[i]
-               if token == "" {
-                       // removed this session in the loop above;
-                       // don't prune it, even if it's already been
-                       // reinserted.
-                       continue
-               }
-               if size <= c.cluster.Collections.WebDAVCache.MaxCollectionBytes/2 {
-                       break
-               }
-               ent, ok := c.sessions.Peek(token)
-               if !ok {
-                       continue
-               }
-               s := ent.(*cachedSession)
-               fs, _ := s.fs.Load().(arvados.CustomFileSystem)
-               if fs == nil {
-                       continue
+       for i := len(keys) - 1; i >= 0 && size > c.cluster.Collections.WebDAVCache.MaxCollectionBytes/2; i-- {
+               if sizes[i] > 0 {
+                       c.sessions.Remove(keys[i])
+                       size -= sizes[i]
                }
-               c.sessions.Remove(token)
-               size -= fs.MemorySize()
        }
 }