From 0e1987d5768cc87e1c9b43a6d969fa525471160d Mon Sep 17 00:00:00 2001 From: Alex Peck Date: Fri, 17 Nov 2023 18:28:38 -0800 Subject: [PATCH 1/2] lruclear --- .../Lru/ConcurrentLruSoakTests.cs | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/BitFaster.Caching.UnitTests/Lru/ConcurrentLruSoakTests.cs b/BitFaster.Caching.UnitTests/Lru/ConcurrentLruSoakTests.cs index 4acf673d..3372c41f 100644 --- a/BitFaster.Caching.UnitTests/Lru/ConcurrentLruSoakTests.cs +++ b/BitFaster.Caching.UnitTests/Lru/ConcurrentLruSoakTests.cs @@ -210,6 +210,29 @@ await Threaded.Run(4, () => cache.Metrics.Value.Evicted.Should().Be(0); } + + [Theory] + [Repeat(10)] + public async Task WhenConcurrentGetAndClearCacheEndsInConsistentState(int iteration) + { + await Threaded.Run(4, r => { + for (int i = 0; i < 100000; i++) + { + if (r == 0 && (i & 15) == 15) + { + lru.Clear(); + } + + lru.GetOrAdd(i + 1, i => i.ToString()); + } + }); + + this.testOutputHelper.WriteLine($"{iteration} {lru.HotCount} {lru.WarmCount} {lru.ColdCount}"); + this.testOutputHelper.WriteLine(string.Join(" ", lru.Keys)); + + RunIntegrityCheck(); + } + private void RunIntegrityCheck() { new ConcurrentLruIntegrityChecker, LruPolicy, TelemetryPolicy>(this.lru).Validate(); From 66fea3086df228827442618d6cd80bac69ac4f5f Mon Sep 17 00:00:00 2001 From: Alex Peck Date: Fri, 17 Nov 2023 18:54:37 -0800 Subject: [PATCH 2/2] warmup --- .../Lru/ConcurrentLruSoakTests.cs | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/BitFaster.Caching.UnitTests/Lru/ConcurrentLruSoakTests.cs b/BitFaster.Caching.UnitTests/Lru/ConcurrentLruSoakTests.cs index 3372c41f..d78262c9 100644 --- a/BitFaster.Caching.UnitTests/Lru/ConcurrentLruSoakTests.cs +++ b/BitFaster.Caching.UnitTests/Lru/ConcurrentLruSoakTests.cs @@ -218,6 +218,7 @@ public async Task WhenConcurrentGetAndClearCacheEndsInConsistentState(int iterat await Threaded.Run(4, r => { for (int i = 0; i < 100000; i++) { + // clear 6,250 times per 1_000_000 iters if (r == 0 && (i & 15) == 15) { lru.Clear(); @@ -233,6 +234,30 @@ await Threaded.Run(4, r => { RunIntegrityCheck(); } + [Theory] + [Repeat(10)] + public async Task WhenConcurrentGetAndClearDuringWarmupCacheEndsInConsistentState(int iteration) + { + await Threaded.Run(4, r => { + for (int i = 0; i < 100000; i++) + { + // clear 25,000 times per 1_000_000 iters + // capacity is 9, so we will try to clear before warmup is done + if (r == 0 && (i & 3) == 3) + { + lru.Clear(); + } + + lru.GetOrAdd(i + 1, i => i.ToString()); + } + }); + + this.testOutputHelper.WriteLine($"{iteration} {lru.HotCount} {lru.WarmCount} {lru.ColdCount}"); + this.testOutputHelper.WriteLine(string.Join(" ", lru.Keys)); + + RunIntegrityCheck(); + } + private void RunIntegrityCheck() { new ConcurrentLruIntegrityChecker, LruPolicy, TelemetryPolicy>(this.lru).Validate();