From 4cf1673e213226433859fc5017c1aa63c278c84c Mon Sep 17 00:00:00 2001 From: Rene Fichtmueller Date: Wed, 29 Apr 2026 22:14:01 +0200 Subject: [PATCH] fix: cache 0-prefix validate results only 90s to prevent stale data from RIPE Stat blips When RIPE Stat briefly returns empty prefixes, the validateResultCache was storing this bad result for 15 minutes. Now 0-prefix results expire after 90 seconds so the next request gets a fresh fetch. Adds optional ttlMs parameter to resultCacheSet/resultCacheGet for per-entry TTL control. --- server.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/server.js b/server.js index 70aba62..cf2777a 100644 --- a/server.js +++ b/server.js @@ -553,12 +553,13 @@ const validateResultCache = new Map(); const RESULT_CACHE_TTL = 15 * 60 * 1000; // 15 minutes function resultCacheGet(map, key) { const e = map.get(String(key)); - if (e && (Date.now() - e.ts) < RESULT_CACHE_TTL) return e.data; + const ttl = e && e.ttl ? e.ttl : RESULT_CACHE_TTL; + if (e && (Date.now() - e.ts) < ttl) return e.data; return undefined; } -function resultCacheSet(map, key, data) { +function resultCacheSet(map, key, data, ttlMs) { if (map.size > 2000) map.delete(map.keys().next().value); - map.set(String(key), { data, ts: Date.now() }); + map.set(String(key), { data, ts: Date.now(), ttl: ttlMs || RESULT_CACHE_TTL }); } // ============================================================ @@ -3372,7 +3373,10 @@ const server = http.createServer(async (req, res) => { note: "left=upstream providers, right=downstream customers, uncertain=peers. Sorted by power score.", }, }; - resultCacheSet(validateResultCache, rawAsn, validateResult); + // Cache 0-prefix results only briefly (90s) — they may be due to temporary API failures + // Full results with prefixes are cached for the standard 15 minutes + const validateCacheTTL = allPrefixes.length === 0 ? 90 * 1000 : RESULT_CACHE_TTL; + resultCacheSet(validateResultCache, rawAsn, validateResult, validateCacheTTL); return res.end(JSON.stringify(validateResult, null, 2)); } catch (err) { res.writeHead(500);