Spaces:
Sleeping
Sleeping
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
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 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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}")
|