Skip to content

Commit 625f67e

Browse files
authored
refactor(state): rename StateTooStale to StateRotten for clarity (#3)
* refactor(state): rename StateTooStale to StateRotten for clarity * fix(tests): update assertion message for stale data check to reflect new naming convention
1 parent e99a721 commit 625f67e

File tree

8 files changed

+35
-35
lines changed

8 files changed

+35
-35
lines changed

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,8 @@ sequenceDiagram
113113
Upstream-->>SF: new value
114114
SF->>NFCache: Del(key)
115115
SF->>Cache: Set(key, value)
116-
else Cache Hit + Stale (serveStale=false) or TooStale
117-
Cache-->>Client: value (stale/too stale)
116+
else Cache Hit + Stale (serveStale=false) or Rotten
117+
Cache-->>Client: value (stale/rotten)
118118
Note over Client: Skip NotFoundCache, fetch directly<br/>(backend has data)
119119
Client->>SF: Fetch(key)
120120
SF->>Upstream: Fetch(key)
@@ -143,8 +143,8 @@ sequenceDiagram
143143
SF->>NFCache: Del(key)
144144
SF->>Cache: Set(key, value)
145145
end
146-
else NotFound Hit + Stale (serveStale=false) or TooStale or Miss
147-
NFCache-->>Client: stale/too stale/miss
146+
else NotFound Hit + Stale (serveStale=false) or Rotten or Miss
147+
NFCache-->>Client: stale/rotten/miss
148148
Client->>SF: Fetch(key)
149149
SF->>Upstream: Fetch(key)
150150
alt Key Exists
@@ -343,7 +343,7 @@ client := cachex.NewClient(
343343
if age < 5*time.Second + 25*time.Second {
344344
return cachex.StateStale
345345
}
346-
return cachex.StateTooStale
346+
return cachex.StateRotten
347347
}),
348348
cachex.WithServeStale[*Product](true),
349349
)

README_ZH.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,8 @@ sequenceDiagram
113113
Upstream-->>SF: new value
114114
SF->>NFCache: Del(key)
115115
SF->>Cache: Set(key, value)
116-
else Cache Hit + Stale (serveStale=false) or TooStale
117-
Cache-->>Client: value (stale/too stale)
116+
else Cache Hit + Stale (serveStale=false) or Rotten
117+
Cache-->>Client: value (stale/rotten)
118118
Note over Client: Skip NotFoundCache, fetch directly<br/>(backend has data)
119119
Client->>SF: Fetch(key)
120120
SF->>Upstream: Fetch(key)
@@ -143,8 +143,8 @@ sequenceDiagram
143143
SF->>NFCache: Del(key)
144144
SF->>Cache: Set(key, value)
145145
end
146-
else NotFound Hit + Stale (serveStale=false) or TooStale or Miss
147-
NFCache-->>Client: stale/too stale/miss
146+
else NotFound Hit + Stale (serveStale=false) or Rotten or Miss
147+
NFCache-->>Client: stale/rotten/miss
148148
Client->>SF: Fetch(key)
149149
SF->>Upstream: Fetch(key)
150150
alt Key Exists
@@ -343,7 +343,7 @@ client := cachex.NewClient(
343343
if age < 5*time.Second + 25*time.Second {
344344
return cachex.StateStale
345345
}
346-
return cachex.StateTooStale
346+
return cachex.StateRotten
347347
}),
348348
cachex.WithServeStale[*Product](true),
349349
)

client.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,8 @@ func (c *Client[T]) get(ctx context.Context, key string, doubleCheck bool) (T, e
114114
return value, nil
115115
}
116116

117-
case StateTooStale:
118-
// Too stale, must refresh
117+
case StateRotten:
118+
// Rotten, must refresh
119119
}
120120
} else if !IsErrKeyNotFound(err) {
121121
return zero, errors.Wrapf(err, "get from backend failed for key: %s", key)
@@ -147,8 +147,8 @@ func (c *Client[T]) get(ctx context.Context, key string, doubleCheck bool) (T, e
147147
}, "key not found in cache for key: %s", key)
148148
}
149149

150-
case StateTooStale:
151-
// Too stale, must refresh
150+
case StateRotten:
151+
// Rotten, must refresh
152152
}
153153
} else if !IsErrKeyNotFound(err) {
154154
return zero, errors.Wrapf(err, "get from notFoundCache failed for key: %s", key)
@@ -415,7 +415,7 @@ func NotFoundWithTTL[T any](cache Cache[time.Time], freshTTL time.Duration, stal
415415
if staleTTL > 0 && age < freshTTL+staleTTL {
416416
return StateStale
417417
}
418-
return StateTooStale
418+
return StateRotten
419419
})
420420
}
421421

client_test.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ func TestClientStaleHandling(t *testing.T) {
8686
if age < 150*time.Millisecond {
8787
return StateStale
8888
}
89-
return StateTooStale
89+
return StateRotten
9090
}
9191

9292
t.Run("without serve stale", func(t *testing.T) {
@@ -142,7 +142,7 @@ func TestClientStaleHandling(t *testing.T) {
142142

143143
value, err = cli.Get(ctx, "key2")
144144
require.NoError(t, err)
145-
assert.Equal(t, "fetch-4", value.Data, "should refetch when too stale")
145+
assert.Equal(t, "fetch-4", value.Data, "should refetch when rotten")
146146
assert.Equal(t, 4, fetchCount)
147147
})
148148
}
@@ -331,12 +331,12 @@ func TestStaleDataCleanupWhenUpstreamDeletes(t *testing.T) {
331331
return nil, &ErrKeyNotFound{}
332332
})
333333

334-
// Stale check: fresh for 100ms, then TooStale (force refetch)
334+
// Stale check: fresh for 100ms, then Rotten (force refetch)
335335
checkStale := func(v *timestampedValue) State {
336336
if clock.Now().Before(v.ExpiresAt) {
337337
return StateFresh
338338
}
339-
return StateTooStale
339+
return StateRotten
340340
}
341341

342342
notFoundCache := newRistrettoCache[time.Time](t)
@@ -361,7 +361,7 @@ func TestStaleDataCleanupWhenUpstreamDeletes(t *testing.T) {
361361
clock.Advance(150 * time.Millisecond)
362362

363363
// Verify cached data is now stale
364-
assert.Equal(t, StateTooStale, checkStale(cachedValue), "cached data should be stale")
364+
assert.Equal(t, StateRotten, checkStale(cachedValue), "cached data should be rotten")
365365

366366
// Step 3: Meanwhile, data was deleted from upstream
367367
realDataExists = false
@@ -537,7 +537,7 @@ func TestDoFetchDoesNotTouchUpstream(t *testing.T) {
537537
if clock.Now().Before(v.ExpiresAt) {
538538
return StateFresh
539539
}
540-
return StateTooStale
540+
return StateRotten
541541
}
542542

543543
client := NewClient(backend, trackedUpstream,
@@ -641,15 +641,15 @@ func TestNotFoundCacheStale(t *testing.T) {
641641
assert.Equal(t, 2, fetchCount, "async refresh should have happened")
642642
})
643643

644-
t.Run("too stale triggers immediate fetch", func(t *testing.T) {
644+
t.Run("rotten triggers immediate fetch", func(t *testing.T) {
645645
clock.Advance(600 * time.Millisecond) // Beyond stale TTL
646646

647647
_, err := cli.Get(ctx, "not-exist")
648648
var e *ErrKeyNotFound
649649
assert.True(t, errors.As(err, &e))
650650
// After refetch, error comes from upstream (not cached)
651-
assert.False(t, e.Cached, "too stale refetch returns fresh upstream error")
652-
assert.Equal(t, 3, fetchCount, "should refetch immediately when too stale")
651+
assert.False(t, e.Cached, "rotten refetch returns fresh upstream error")
652+
assert.Equal(t, 3, fetchCount, "should refetch immediately when rotten")
653653
})
654654
}
655655

entry.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,6 @@ func EntryWithTTL[T any](freshTTL, staleTTL time.Duration) ClientOption[*Entry[T
2121
if age < freshTTL+staleTTL {
2222
return StateStale
2323
}
24-
return StateTooStale
24+
return StateRotten
2525
})
2626
}

entry_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -108,14 +108,14 @@ func TestEntryWithTTL(t *testing.T) {
108108
assert.Equal(t, StateStale, state)
109109
})
110110

111-
t.Run("too stale entry", func(t *testing.T) {
111+
t.Run("rotten entry", func(t *testing.T) {
112112
now := time.Now()
113113
oldNowFunc := NowFunc
114114
NowFunc = func() time.Time { return now }
115115
defer func() { NowFunc = oldNowFunc }()
116116

117117
entry := &Entry[string]{
118-
Data: "too stale data",
118+
Data: "rotten data",
119119
CachedAt: now.Add(-20 * time.Second), // 20 seconds ago
120120
}
121121

@@ -124,7 +124,7 @@ func TestEntryWithTTL(t *testing.T) {
124124
option(client)
125125

126126
state := client.checkDataStale(entry)
127-
assert.Equal(t, StateTooStale, state)
127+
assert.Equal(t, StateRotten, state)
128128
})
129129

130130
t.Run("exact boundary - fresh to stale", func(t *testing.T) {
@@ -146,7 +146,7 @@ func TestEntryWithTTL(t *testing.T) {
146146
assert.Equal(t, StateStale, state)
147147
})
148148

149-
t.Run("exact boundary - stale to too stale", func(t *testing.T) {
149+
t.Run("exact boundary - stale to rotten", func(t *testing.T) {
150150
now := time.Now()
151151
oldNowFunc := NowFunc
152152
NowFunc = func() time.Time { return now }
@@ -162,7 +162,7 @@ func TestEntryWithTTL(t *testing.T) {
162162
option(client)
163163

164164
state := client.checkDataStale(entry)
165-
assert.Equal(t, StateTooStale, state)
165+
assert.Equal(t, StateRotten, state)
166166
})
167167
}
168168

error.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ func (e *ErrKeyNotFound) Error() string {
2222
return "key not found (cached, fresh)"
2323
case StateStale:
2424
return "key not found (cached, stale)"
25-
case StateTooStale:
26-
return "key not found (cached, too stale)"
25+
case StateRotten:
26+
return "key not found (cached, rotten)"
2727
default:
2828
return fmt.Sprintf("key not found (cached, state=%d)", e.CacheState)
2929
}

types.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ import (
88
type State int8
99

1010
const (
11-
StateFresh State = iota // Data is fresh and valid
12-
StateStale // Data is stale but usable
13-
StateTooStale // Data is too stale and must be refreshed
11+
StateFresh State = iota // Data is fresh and valid
12+
StateStale // Data is stale but usable
13+
StateRotten // Data is rotten and must be refreshed
1414
)
1515

1616
// Upstream defines the interface for a data source that can retrieve values

0 commit comments

Comments
 (0)