From 0d1f08a6cdaf491670f3e4508586c1801f5da64a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 29 Apr 2024 21:44:42 +0200 Subject: [PATCH] cache/dynacache: Don't mark all evicted items as stale Limit that to the evicted items that matches the given change set. Currently this doesn't make any practical difference, but it would make the stale flag more general useful. --- cache/dynacache/dynacache.go | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/cache/dynacache/dynacache.go b/cache/dynacache/dynacache.go index 6190dd234..5c34b2831 100644 --- a/cache/dynacache/dynacache.go +++ b/cache/dynacache/dynacache.go @@ -74,7 +74,6 @@ func New(opts Options) *Cache { evictedIdentities.Push(id) return false }) - resource.MarkStale(v) } c := &Cache{ @@ -458,11 +457,8 @@ func (p *Partition[K, V]) clearMatching(predicate func(k, v any) bool) { func (p *Partition[K, V]) clearOnRebuild(changeset ...identity.Identity) { opts := p.getOptions() - if opts.ClearWhen == ClearNever { - return - } - if opts.ClearWhen == ClearOnRebuild { + if opts.ClearWhen == ClearOnRebuild && len(changeset) == 0 { // Clear all. p.Clear() return @@ -502,7 +498,14 @@ func (p *Partition[K, V]) clearOnRebuild(changeset ...identity.Identity) { // Second pass needs to be done in a separate loop to catch any // elements marked as stale in the other partitions. p.c.DeleteFunc(func(key K, v V) bool { - if shouldDelete(key, v) { + match := shouldDelete(key, v) + clear := match || opts.ClearWhen == ClearOnRebuild + + if match { + resource.MarkStale(v) + } + + if clear { p.trace.Log( logg.StringFunc( func() string { @@ -510,9 +513,9 @@ func (p *Partition[K, V]) clearOnRebuild(changeset ...identity.Identity) { }, ), ) - return true } - return false + + return clear }) } @@ -586,7 +589,6 @@ type PartitionManager interface { const ( ClearOnRebuild ClearWhen = iota + 1 ClearOnChange - ClearNever ) type ClearWhen int