Skip to content

Commit be32365

Browse files
committed
fix: add threading lock to LRU cache to prevent data corruption under concurrent load (#562)
1 parent 4f95ffb commit be32365

1 file changed

Lines changed: 16 additions & 11 deletions

File tree

backend/app/cache.py

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import json
1414
import logging
1515
import os
16+
import threading
1617
from typing import Optional
1718

1819
logger = logging.getLogger(__name__)
@@ -74,26 +75,30 @@ def _get_redis():
7475

7576
_lru_store: dict = {}
7677
_lru_order: list = []
78+
_lru_lock = threading.Lock()
7779

7880

7981
def _lru_get(key: str) -> Optional[str]:
80-
return _lru_store.get(key)
82+
with _lru_lock:
83+
return _lru_store.get(key)
8184

8285

8386
def _lru_set(key: str, value: str) -> None:
84-
if key in _lru_store:
85-
_lru_order.remove(key)
86-
elif len(_lru_store) >= LRU_MAX_SIZE:
87-
oldest = _lru_order.pop(0)
88-
del _lru_store[oldest]
89-
_lru_store[key] = value
90-
_lru_order.append(key)
87+
with _lru_lock:
88+
if key in _lru_store:
89+
_lru_order.remove(key)
90+
elif len(_lru_store) >= LRU_MAX_SIZE:
91+
oldest = _lru_order.pop(0)
92+
del _lru_store[oldest]
93+
_lru_store[key] = value
94+
_lru_order.append(key)
9195

9296

9397
def _lru_delete(key: str) -> None:
94-
if key in _lru_store:
95-
del _lru_store[key]
96-
_lru_order.remove(key)
98+
with _lru_lock:
99+
if key in _lru_store:
100+
del _lru_store[key]
101+
_lru_order.remove(key)
97102

98103

99104
# ---------------------------------------------------------------------------

0 commit comments

Comments
 (0)