perf: cap _looked_up_icaos at 50 000 entries with LRU eviction

This commit is contained in:
James Smith
2026-05-19 15:02:46 +01:00
parent 956e057878
commit 09ae922338
+8 -3
View File
@@ -12,6 +12,7 @@ import socket
import subprocess import subprocess
import threading import threading
import time import time
from collections import OrderedDict
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta, timezone
from typing import Any from typing import Any
@@ -83,8 +84,10 @@ adsb_active_sdr_type: str | None = None
adsb_bias_t_active = False # Track if bias-t was enabled at start (for cleanup on stop) adsb_bias_t_active = False # Track if bias-t was enabled at start (for cleanup on stop)
_sbs_error_logged = False # Suppress repeated connection error logs _sbs_error_logged = False # Suppress repeated connection error logs
# Track ICAOs already looked up in aircraft database (avoid repeated lookups) # Track ICAOs already looked up in aircraft database (avoid repeated lookups).
_looked_up_icaos: set[str] = set() # Bounded LRU: evicts oldest entry when full to prevent unbounded memory growth.
_ICAO_CACHE_MAX = 50_000
_looked_up_icaos: OrderedDict[str, None] = OrderedDict()
# Per-client SSE queues for ADS-B stream fanout. # Per-client SSE queues for ADS-B stream fanout.
_adsb_stream_subscribers: set[queue.Queue] = set() _adsb_stream_subscribers: set[queue.Queue] = set()
@@ -727,7 +730,9 @@ def parse_sbs_stream(service_addr):
# Look up aircraft type from database (once per ICAO) # Look up aircraft type from database (once per ICAO)
if icao not in _looked_up_icaos: if icao not in _looked_up_icaos:
_looked_up_icaos.add(icao) if len(_looked_up_icaos) >= _ICAO_CACHE_MAX:
_looked_up_icaos.popitem(last=False)
_looked_up_icaos[icao] = None
db_info = aircraft_db.lookup(icao) db_info = aircraft_db.lookup(icao)
if db_info: if db_info:
if db_info["registration"]: if db_info["registration"]: