Skip to content

Commit 9435f9a

Browse files
authored
update metric (#186)
* outline * tests
1 parent f684429 commit 9435f9a

12 files changed

+100
-4
lines changed

BitFaster.Caching.UnitTests/Lfu/ConcurrentLfuTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ public void WhenWriteBufferIsFullUpdatesAreDropped()
233233
var scheduler = new TestScheduler();
234234
cache = new ConcurrentLfu<int, int>(1, 20, scheduler);
235235

236-
cache.GetOrAdd(-1, k => k);
236+
cache.GetOrAdd(1, k => k);
237237
scheduler.RunCount.Should().Be(1);
238238
cache.PendingMaintenance();
239239

@@ -244,7 +244,7 @@ public void WhenWriteBufferIsFullUpdatesAreDropped()
244244

245245
cache.PendingMaintenance();
246246

247-
// TODO: how to verify this? There is no counter for updates.
247+
cache.Metrics.Value.Updated.Should().Be(bufferSize);
248248
}
249249

250250
[Fact]

BitFaster.Caching.UnitTests/Lru/ClassicLruTests.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,16 @@ public void WhenKeyExistsTryUpdateUpdatesValueAndReturnsTrue()
372372
value.Should().Be("2");
373373
}
374374

375+
[Fact]
376+
public void WhenKeyExistsTryUpdateIncrementsUpdateCount()
377+
{
378+
lru.GetOrAdd(1, valueFactory.Create);
379+
380+
lru.TryUpdate(1, "2").Should().BeTrue();
381+
382+
lru.Metrics.Value.Updated.Should().Be(1);
383+
}
384+
375385
[Fact]
376386
public void WhenKeyDoesNotExistTryUpdateReturnsFalse()
377387
{
@@ -380,6 +390,16 @@ public void WhenKeyDoesNotExistTryUpdateReturnsFalse()
380390
lru.TryUpdate(2, "3").Should().BeFalse();
381391
}
382392

393+
[Fact]
394+
public void WhenKeyDoesNotExistTryUpdateDoesNotIncrementCounter()
395+
{
396+
lru.GetOrAdd(1, valueFactory.Create);
397+
398+
lru.TryUpdate(2, "3").Should().BeFalse();
399+
400+
lru.Metrics.Value.Updated.Should().Be(0);
401+
}
402+
383403
[Fact]
384404
public void WhenKeyDoesNotExistAddOrUpdateAddsNewItem()
385405
{

BitFaster.Caching.UnitTests/Lru/ConcurrentLruTests.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -636,6 +636,16 @@ public void WhenKeyExistsTryUpdateDisposesOldValue()
636636
disposableValueFactory.Items[1].IsDisposed.Should().BeTrue();
637637
}
638638

639+
[Fact]
640+
public void WhenKeyExistsTryUpdateIncrementsUpdateCount()
641+
{
642+
lru.GetOrAdd(1, valueFactory.Create);
643+
644+
lru.TryUpdate(1, "2").Should().BeTrue();
645+
646+
lru.Metrics.Value.Updated.Should().Be(1);
647+
}
648+
639649
[Fact]
640650
public void WhenKeyDoesNotExistTryUpdateReturnsFalse()
641651
{
@@ -644,6 +654,16 @@ public void WhenKeyDoesNotExistTryUpdateReturnsFalse()
644654
lru.TryUpdate(2, "3").Should().BeFalse();
645655
}
646656

657+
[Fact]
658+
public void WhenKeyDoesNotExistTryUpdateDoesNotIncrementCounter()
659+
{
660+
lru.GetOrAdd(1, valueFactory.Create);
661+
662+
lru.TryUpdate(2, "3").Should().BeFalse();
663+
664+
lru.Metrics.Value.Updated.Should().Be(0);
665+
}
666+
647667
[Fact]
648668
public void WhenKeyDoesNotExistAddOrUpdateAddsNewItem()
649669
{

BitFaster.Caching.UnitTests/Lru/NoTelemetryPolicyTests.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ public void MissesIsZero()
3535
counter.Misses.Should().Be(0);
3636
}
3737

38+
[Fact]
39+
public void UpdatedIsZero()
40+
{
41+
counter.Updated.Should().Be(0);
42+
}
43+
3844
[Fact]
3945
public void EvictedIsZero()
4046
{
@@ -53,6 +59,12 @@ public void IncrementTotalCountIsNoOp()
5359
counter.Invoking(c => c.IncrementMiss()).Should().NotThrow();
5460
}
5561

62+
[Fact]
63+
public void OnItemUpdatedIsNoOp()
64+
{
65+
counter.Invoking(c => c.OnItemUpdated(1, 2)).Should().NotThrow();
66+
}
67+
5668
[Fact]
5769
public void OnItemRemovedIsNoOp()
5870
{

BitFaster.Caching.UnitTests/Lru/TelemetryPolicyTests.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,23 @@ public void WhenTotalCountIsZeroRatioReturnsZero()
6464
}
6565

6666
[Fact]
67-
public void WhenItemRemovedIsEvictedIncrementEvictedCount()
67+
public void WhenItemUpdatedIncrementUpdatedCount()
68+
{
69+
telemetryPolicy.OnItemUpdated(1, 2);
70+
71+
telemetryPolicy.Updated.Should().Be(1);
72+
}
73+
74+
[Fact]
75+
public void WhenItemRemovedIncrementEvictedCount()
6876
{
6977
telemetryPolicy.OnItemRemoved(1, 2, ItemRemovedReason.Evicted);
7078

7179
telemetryPolicy.Evicted.Should().Be(1);
7280
}
7381

7482
[Fact]
75-
public void WhenItemRemovedIsRemovedDontIncrementEvictedCount()
83+
public void WhenItemRemovedDontIncrementEvictedCount()
7684
{
7785
telemetryPolicy.OnItemRemoved(1, 2, ItemRemovedReason.Removed);
7886

BitFaster.Caching/ICacheMetrics.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,10 @@ public interface ICacheMetrics
3636
/// Gets the total number of evicted items.
3737
/// </summary>
3838
long Evicted { get; }
39+
40+
/// <summary>
41+
/// Gets the total number of updated items.
42+
/// </summary>
43+
long Updated { get; }
3944
}
4045
}

BitFaster.Caching/Lfu/ConcurrentLfu.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,13 +464,16 @@ private void OnWrite(LinkedListNode<LfuNode<K, V>> node)
464464
else
465465
{
466466
this.windowLru.MoveToEnd(node);
467+
this.metrics.updatedCount++;
467468
}
468469
break;
469470
case Position.Probation:
470471
PromoteProbation(node);
472+
this.metrics.updatedCount++;
471473
break;
472474
case Position.Protected:
473475
this.protectedLru.MoveToEnd(node);
476+
this.metrics.updatedCount++;
474477
break;
475478
}
476479
}
@@ -592,6 +595,7 @@ private class CacheMetrics : ICacheMetrics
592595
{
593596
public long requestHitCount;
594597
public long requestMissCount;
598+
public long updatedCount;
595599
public long evictedCount;
596600

597601
public double HitRatio => (double)requestHitCount / (double)Total;
@@ -602,6 +606,8 @@ private class CacheMetrics : ICacheMetrics
602606

603607
public long Misses => requestMissCount;
604608

609+
public long Updated => updatedCount;
610+
605611
public long Evicted => evictedCount;
606612
}
607613

BitFaster.Caching/Lru/ClassicLru.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,7 @@ public bool TryUpdate(K key, V value)
224224
if (this.dictionary.TryGetValue(key, out var node))
225225
{
226226
node.Value.Value = value;
227+
Interlocked.Increment(ref this.metrics.updatedCount);
227228
return true;
228229
}
229230

@@ -238,6 +239,7 @@ public void AddOrUpdate(K key, V value)
238239
if (this.dictionary.TryGetValue(key, out var existingNode))
239240
{
240241
existingNode.Value.Value = value;
242+
Interlocked.Increment(ref this.metrics.updatedCount);
241243
return;
242244
}
243245

@@ -377,6 +379,7 @@ private class CacheMetrics : ICacheMetrics
377379
{
378380
public long requestHitCount;
379381
public long requestTotalCount;
382+
public long updatedCount;
380383
public long evictedCount;
381384

382385
public double HitRatio => (double)requestHitCount / (double)requestTotalCount;
@@ -388,6 +391,8 @@ private class CacheMetrics : ICacheMetrics
388391
public long Misses => requestTotalCount - requestHitCount;
389392

390393
public long Evicted => evictedCount;
394+
395+
public long Updated => updatedCount;
391396
}
392397
}
393398
}

BitFaster.Caching/Lru/ConcurrentLruCore.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,7 @@ public bool TryUpdate(K key, V value)
263263
V oldValue = existing.Value;
264264
existing.Value = value;
265265
this.itemPolicy.Update(existing);
266+
this.telemetryPolicy.OnItemUpdated(existing.Key, existing.Value);
266267
Disposer<V>.Dispose(oldValue);
267268

268269
return true;
@@ -655,6 +656,8 @@ public Proxy(ConcurrentLruCore<K, V, I, P, T> lru)
655656

656657
public long Evicted => lru.telemetryPolicy.Evicted;
657658

659+
public long Updated => lru.telemetryPolicy.Updated;
660+
658661
public int Capacity => lru.Capacity;
659662

660663
public TimeSpan TimeToLive => lru.itemPolicy.TimeToLive;

BitFaster.Caching/Lru/ITelemetryPolicy.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ public interface ITelemetryPolicy<K, V> : ICacheMetrics, ICacheEvents<K, V>
1414

1515
void OnItemRemoved(K key, V value, ItemRemovedReason reason);
1616

17+
void OnItemUpdated(K key, V value);
18+
1719
void SetEventSource(object source);
1820
}
1921
}

0 commit comments

Comments
 (0)