X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/6b0d4ac8df4b5b4255eb56b1d76865f06089ca2a..1c50d29ea10fa90a379ee1d3fe7d8e05681d8622:/services/keep-web/cache.go diff --git a/services/keep-web/cache.go b/services/keep-web/cache.go index 3ba3e60abd..db06d63509 100644 --- a/services/keep-web/cache.go +++ b/services/keep-web/cache.go @@ -185,9 +185,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 _, 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 @@ -198,27 +199,17 @@ func (c *cache) pruneSessions() { 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 size <= c.cluster.Collections.WebDAVCache.MaxCollectionBytes { - 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; i-- { + if sizes[i] > 0 { + c.sessions.Remove(keys[i]) + size -= sizes[i] } - c.sessions.Remove(token) - size -= fs.MemorySize() } }