Atlas › Test

TestCleanupThrottledByInterval

Exact test identity: go.temporal.io/server/common/quotas/TestMapRequestRateLimiterSuite/TestCleanupThrottledByInterval

Package
go.temporal.io/server/common/quotas
Suite / test hierarchy
TestMapRequestRateLimiterSuite/TestCleanupThrottledByInterval
Test
TestCleanupThrottledByInterval
Introduced at
TestCleanupThrottledByInterval Frontier kind: Test frontier
Covered ranges
9
Covered lines
42
Covered files
2

Covered source

Expand a file to inspect source; the > gutter marks covered lines.

go.temporal.io/server/common/quotas/map_request_rate_limiter_impl.go 39 covered LOC · 8 ranges

Open complete file

40 rateLimiterGenFn RequestRateLimiterFn,
41 rateLimiterKeyFn RequestRateLimiterKeyFn[K],
42 > ) *MapRequestRateLimiterImpl[K] { map_request_rate_limiter_impl.go
43 > return &MapRequestRateLimiterImpl[K]{
44 > rateLimiterGenFn: rateLimiterGenFn,
45 > rateLimiterKeyFn: rateLimiterKeyFn,
46 > rateLimiters: make(map[K]*rateLimiterEntry),
47 > ttlNano: int64(rateLimiterTTL),
48 > cleanupTicker: time.NewTicker(rateLimiterCleanupInterval),
49 > }
50 > }
51
52 > func namespaceRequestRateLimiterKeyFn(req Request) string { map_request_rate_limiter_impl.go
53 > return req.Caller
54 > }
55
56 func NewNamespaceRequestRateLimiter(
66 now time.Time,
67 request Request,
69 > rateLimiter := r.getOrInitRateLimiter(now, request)
70 > return rateLimiter.Allow(now, request)
71 > }
72
73 // Reserve returns a Reservation that indicates how long the caller
94 now time.Time,
95 req Request,
96 > ) RequestRateLimiter { map_request_rate_limiter_impl.go
97 > r.maybeCleanup(now)
98 >
99 > key := r.rateLimiterKeyFn(req)
100 > nowNano := now.UnixNano()
101 >
102 > r.RLock()
103 > entry, ok := r.rateLimiters[key]
104 > r.RUnlock()
105 >
106 > if ok {
107 entry.lastAccess.Store(nowNano)
108 return entry.rateLimiter
109 }
110
111 > newRateLimiter := r.rateLimiterGenFn(req) map_request_rate_limiter_impl.go
112 > r.Lock()
113 > defer r.Unlock()
114 >
115 > if entry, ok := r.rateLimiters[key]; ok {
116 entry.lastAccess.Store(nowNano)
117 return entry.rateLimiter
118 }
119
120 > entry = &rateLimiterEntry{rateLimiter: newRateLimiter} map_request_rate_limiter_impl.go
121 > entry.lastAccess.Store(nowNano)
122 > r.rateLimiters[key] = entry
123 > return newRateLimiter
124 }
125
127 // receive drains at most one ticker tick, so only one sweeper starts even if many
128 // callers reach here at once.
129 > func (r *MapRequestRateLimiterImpl[K]) maybeCleanup(now time.Time) { map_request_rate_limiter_impl.go
130 > select {
131 case <-r.cleanupTicker.C:
132 go r.cleanup(now)
134 }
135 }
go.temporal.io/server/common/quotas/noop_request_rate_limiter_impl.go 3 covered LOC · 1 range

Open complete file