Skip to content

Commit 2c5cbcd

Browse files
authoredFeb 15, 2024··
Avoid incrementing cache hits for expired entries (#2159)
1 parent bc8404d commit 2c5cbcd

File tree

3 files changed

+28
-1
lines changed

3 files changed

+28
-1
lines changed
 

‎.changeset/forty-coins-hug.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"effect": patch
3+
---
4+
5+
Avoid incrementing cache hits for expired entries

‎packages/effect/src/internal/cache.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -551,11 +551,11 @@ class CacheImpl<in out Key, in out Error, in out Value> implements Cache.Cache<K
551551
switch (value._tag) {
552552
case "Complete": {
553553
this.trackAccess(value.key)
554-
this.trackHit()
555554
if (this.hasExpired(clock, value.timeToLiveMillis)) {
556555
MutableHashMap.remove(this.cacheState.map, value.key.current)
557556
return core.succeed(Option.none<Value>())
558557
}
558+
this.trackHit()
559559
return core.map(value.exit, Option.some)
560560
}
561561
case "Pending": {

‎packages/effect/test/Cache.test.ts

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import * as it from "effect-test/utils/extend"
2+
import * as Cache from "effect/Cache"
3+
import * as Effect from "effect/Effect"
4+
import * as TestClock from "effect/TestClock"
5+
import { describe, expect } from "vitest"
6+
7+
describe("Cache", () => {
8+
it.effect("should not increment cache hits on expired entries", () =>
9+
Effect.gen(function*(_) {
10+
const cache = yield* _(Cache.make({
11+
capacity: 100,
12+
timeToLive: "1 seconds",
13+
lookup: (n: number) => Effect.succeed(n)
14+
}))
15+
yield* _(cache.get(42))
16+
yield* _(TestClock.adjust("2 seconds"))
17+
yield* _(cache.get(42))
18+
const { hits, misses } = yield* _(cache.cacheStats)
19+
expect(hits).toBe(0)
20+
expect(misses).toBe(2)
21+
}))
22+
})

0 commit comments

Comments
 (0)
Please sign in to comment.