abinazebinoy commited on
Commit
9d85e1e
·
1 Parent(s): 60c253a

fix(BACKEND-1): move rate limiter eviction AFTER current key pruning -- prevents losing rate-limit tracking on burst-after-idle patterns

Browse files
Files changed (1) hide show
  1. api/middleware/rate_limiter.py +5 -3
api/middleware/rate_limiter.py CHANGED
@@ -51,15 +51,17 @@ class SlidingWindowRateLimiter(BaseHTTPMiddleware):
51
  key = f"{ip}:{path.split('/')[1]}"
52
  now = time.time()
53
 
54
- # Evict stale entries every 5 minutes to prevent memory leak (BUG-14)
 
 
 
 
55
  if now - self._evict_at > 300:
56
  stale_keys = [k for k, ts in self._windows.items() if not ts or now - ts[0] > window]
57
  for k in stale_keys:
58
  del self._windows[k]
59
  self._evict_at = now
60
 
61
- self._windows[key] = [t for t in self._windows[key] if now - t < window]
62
-
63
  if len(self._windows[key]) >= max_req:
64
  retry = int(window - (now - self._windows[key][0]))
65
  logger.warning(f"[RateLimit] {ip} exceeded {max_req}/min on {path}")
 
51
  key = f"{ip}:{path.split('/')[1]}"
52
  now = time.time()
53
 
54
+ # BACKEND-1 FIX: prune current key FIRST, THEN evict stale entries.
55
+ # Previous order evicted before pruning -- lost tracking on burst-after-idle keys.
56
+ self._windows[key] = [t for t in self._windows[key] if now - t < window]
57
+
58
+ # Evict stale entries every 5 minutes to prevent memory leak
59
  if now - self._evict_at > 300:
60
  stale_keys = [k for k, ts in self._windows.items() if not ts or now - ts[0] > window]
61
  for k in stale_keys:
62
  del self._windows[k]
63
  self._evict_at = now
64
 
 
 
65
  if len(self._windows[key]) >= max_req:
66
  retry = int(window - (now - self._windows[key][0]))
67
  logger.warning(f"[RateLimit] {ip} exceeded {max_req}/min on {path}")