From 3f30aaf25ec5f55da9dffcb2c553bbd20a7a80ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Sat, 30 Nov 2024 16:06:50 +0800 Subject: [PATCH] freelru: purge all expired items --- contrab/freelru/lru.go | 13 +++++++++---- contrab/freelru/lru_test.go | 19 +++++++------------ 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/contrab/freelru/lru.go b/contrab/freelru/lru.go index 7f732ea6..56422255 100644 --- a/contrab/freelru/lru.go +++ b/contrab/freelru/lru.go @@ -688,14 +688,19 @@ func (lru *LRU[K, V]) Purge() { // The evict function is called for each expired item. func (lru *LRU[K, V]) PurgeExpired() { l := lru.len + if l == 0 { + return + } + n := now() + pos := lru.head for i := uint32(0); i < l; i++ { - pos := lru.elements[lru.head].next + next := lru.elements[pos].next if lru.elements[pos].expire != 0 { - if lru.elements[pos].expire > now() { - return // no more expired items + if lru.elements[pos].expire <= n { + lru.removeAt(pos) } - lru.removeAt(pos) } + pos = next } } diff --git a/contrab/freelru/lru_test.go b/contrab/freelru/lru_test.go index 26508021..0b548b5f 100644 --- a/contrab/freelru/lru_test.go +++ b/contrab/freelru/lru_test.go @@ -14,10 +14,9 @@ func TestUpdateLifetimeOnGet(t *testing.T) { t.Parallel() lru, err := freelru.New[string, string](1024, maphash.NewHasher[string]().Hash32) require.NoError(t, err) - lru.SetUpdateLifetimeOnGet(true) lru.AddWithLifetime("hello", "world", 2*time.Second) time.Sleep(time.Second) - _, ok := lru.Get("hello") + _, ok := lru.GetAndRefresh("hello") require.True(t, ok) time.Sleep(time.Second + time.Millisecond*100) _, ok = lru.Get("hello") @@ -28,7 +27,6 @@ func TestUpdateLifetimeOnGet1(t *testing.T) { t.Parallel() lru, err := freelru.New[string, string](1024, maphash.NewHasher[string]().Hash32) require.NoError(t, err) - lru.SetUpdateLifetimeOnGet(true) lru.AddWithLifetime("hello", "world", 2*time.Second) time.Sleep(time.Second) lru.Peek("hello") @@ -82,14 +80,11 @@ func TestPeekWithLifetime(t *testing.T) { lru, err := freelru.New[string, string](1024, maphash.NewHasher[string]().Hash32) require.NoError(t, err) lru.SetLifetime(time.Second) - lru.Add("1", "") - time.Sleep(300 * time.Millisecond) - lru.Add("2", "") - time.Sleep(300 * time.Millisecond) - lru.Add("3", "") - time.Sleep(300 * time.Millisecond) - lru.Add("4", "") - time.Sleep(time.Second) + lru.AddWithLifetime("hello", "world", 10*time.Second) + lru.Add("hello1", "") + lru.Add("hello2", "") + lru.Add("hello3", "") + time.Sleep(2 * time.Second) lru.PurgeExpired() - require.Equal(t, 0, lru.Len()) + require.Equal(t, 1, lru.Len()) }