Attempt to make Clear concurrency-safe
This is an attempt at fixing #81 without imposing a performance hit on the cache's "normal" (get/set/fetch) activity. Calling "Clear" is now considerably more expensive.
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
||||
"math/rand"
|
||||
"sort"
|
||||
"strconv"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"testing"
|
||||
"time"
|
||||
@@ -361,6 +362,40 @@ func Test_ConcurrentStop(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func Test_ConcurrentClearAndSet(t *testing.T) {
|
||||
for i := 0; i < 100; i++ {
|
||||
var stop atomic.Bool
|
||||
var wg sync.WaitGroup
|
||||
|
||||
cache := New(Configure[string]())
|
||||
r := func() {
|
||||
for !stop.Load() {
|
||||
cache.Set("a", "a", time.Minute)
|
||||
}
|
||||
wg.Done()
|
||||
}
|
||||
go r()
|
||||
wg.Add(1)
|
||||
cache.Clear()
|
||||
stop.Store(true)
|
||||
wg.Wait()
|
||||
time.Sleep(time.Millisecond)
|
||||
cache.SyncUpdates()
|
||||
|
||||
known := make(map[string]struct{})
|
||||
for node := cache.list.Head; node != nil; node = node.Next {
|
||||
known[node.Value.key] = struct{}{}
|
||||
}
|
||||
|
||||
for _, bucket := range cache.buckets {
|
||||
for key := range bucket.lookup {
|
||||
_, exists := known[key]
|
||||
assert.True(t, exists)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
type SizedItem struct {
|
||||
id int
|
||||
s int64
|
||||
|
Reference in New Issue
Block a user