From d953675085476c98772fbc495ccaf47b9fd479df Mon Sep 17 00:00:00 2001 From: Kevin Wan Date: Sat, 4 Mar 2023 20:34:15 +0800 Subject: [PATCH] chore: add tests (#2960) --- core/stores/cache/cachenode.go | 3 ++- core/stores/cache/cachenode_test.go | 29 +++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/core/stores/cache/cachenode.go b/core/stores/cache/cachenode.go index 43d1c478..3c0ccc42 100644 --- a/core/stores/cache/cachenode.go +++ b/core/stores/cache/cachenode.go @@ -277,5 +277,6 @@ func (c cacheNode) processCache(ctx context.Context, key, data string, v any) er func (c cacheNode) setCacheWithNotFound(ctx context.Context, key string) error { seconds := int(math.Ceil(c.aroundDuration(c.notFoundExpiry).Seconds())) - return c.rds.SetexCtx(ctx, key, notFoundPlaceholder, seconds) + _, err := c.rds.SetnxExCtx(ctx, key, notFoundPlaceholder, seconds) + return err } diff --git a/core/stores/cache/cachenode_test.go b/core/stores/cache/cachenode_test.go index ab2cae06..8b2fe922 100644 --- a/core/stores/cache/cachenode_test.go +++ b/core/stores/cache/cachenode_test.go @@ -212,6 +212,35 @@ func TestCacheNode_TakeNotFound(t *testing.T) { assert.Equal(t, errDummy, err) } +func TestCacheNode_TakeNotFoundButChangedByOthers(t *testing.T) { + store, clean, err := redistest.CreateRedis() + assert.NoError(t, err) + defer clean() + + cn := cacheNode{ + rds: store, + r: rand.New(rand.NewSource(time.Now().UnixNano())), + barrier: syncx.NewSingleFlight(), + lock: new(sync.Mutex), + unstableExpiry: mathx.NewUnstable(expiryDeviation), + stat: NewStat("any"), + errNotFound: errTestNotFound, + } + + var str string + err = cn.Take(&str, "any", func(v any) error { + store.Set("any", "foo") + return errTestNotFound + }) + assert.True(t, cn.IsNotFound(err)) + + val, err := store.Get("any") + if assert.NoError(t, err) { + assert.Equal(t, "foo", val) + } + assert.True(t, cn.IsNotFound(cn.Get("any", &str))) +} + func TestCacheNode_TakeWithExpire(t *testing.T) { store, clean, err := redistest.CreateRedis() assert.Nil(t, err)