From 660bbbc4a3d494aa009fa2155fd2e30c68ba88c9 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 | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/cache/dynacache/dynacache.go b/cache/dynacache/dynacache.go index 87ef68f5be2..f13e3957570 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{ @@ -434,11 +433,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 @@ -478,7 +474,12 @@ 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 clear { + resource.MarkStale(v) + p.trace.Log( logg.StringFunc( func() string { @@ -486,9 +487,9 @@ func (p *Partition[K, V]) clearOnRebuild(changeset ...identity.Identity) { }, ), ) - return true } - return false + + return clear }) } @@ -562,7 +563,6 @@ type PartitionManager interface { const ( ClearOnRebuild ClearWhen = iota + 1 ClearOnChange - ClearNever ) type ClearWhen int