


















@@ -250,4 +250,60 @@ describe("startGatewayMaintenanceTimers", () => {
250250251251stopMaintenanceTimers(timers);
252252});
253+254+it("evicts multiple dedupe overflows by oldest timestamp with interleaved reinsertions", async () => {
255+vi.useFakeTimers();
256+vi.setSystemTime(new Date("2026-03-22T00:00:00Z"));
257+const { startGatewayMaintenanceTimers } = await import("./server-maintenance.js");
258+const deps = createMaintenanceTimerDeps();
259+const now = Date.now();
260+261+// Fill to max with sequential timestamps
262+for (let index = 0; index < DEDUPE_MAX; index += 1) {
263+deps.dedupe.set(`item-${index}`, { ts: now - 10_000 + index, ok: true });
264+}
265+266+// Interleave updates and overflows:
267+// 1. Move item-0 to be the newest (was oldest)
268+deps.dedupe.delete("item-0");
269+deps.dedupe.set("item-0", { ts: now, ok: true });
270+271+// 2. Add multiple overflows
272+deps.dedupe.set("overflow-1", { ts: now - 5_000, ok: true }); // Should survive (middle age)
273+deps.dedupe.set("overflow-2", { ts: now - 20_000, ok: true }); // Should be evicted (oldest)
274+275+// 3. Move item-500 to be very old
276+deps.dedupe.delete("item-500");
277+deps.dedupe.set("item-500", { ts: now - 30_000, ok: true }); // Should be evicted (new oldest)
278+279+const timers = startGatewayMaintenanceTimers(deps);
280+281+// Initial size is DEDUPE_MAX + 2 (item-0 and item-500 were re-added, overflow-1 and overflow-2 added)
282+// Actually:
283+// item-1 to item-499 (499)
284+// item-501 to item-999 (499)
285+// item-0 (1)
286+// item-500 (1)
287+// overflow-1 (1)
288+// overflow-2 (1)
289+// Total: 499 + 499 + 1 + 1 + 1 + 1 = 1002
290+expect(deps.dedupe.size).toBe(DEDUPE_MAX + 2);
291+292+await vi.advanceTimersByTimeAsync(60_000);
293+294+expect(deps.dedupe.size).toBe(DEDUPE_MAX);
295+296+// item-500 (now - 30k) and overflow-2 (now - 20k) should be gone
297+expect(deps.dedupe.has("item-500")).toBe(false);
298+expect(deps.dedupe.has("overflow-2")).toBe(false);
299+300+// item-0 (now) and overflow-1 (now - 5k) should remain
301+expect(deps.dedupe.has("item-0")).toBe(true);
302+expect(deps.dedupe.has("overflow-1")).toBe(true);
303+304+// item-1 (now - 10k + 1) should remain as it is now one of the oldest but not evicted
305+expect(deps.dedupe.has("item-1")).toBe(true);
306+307+stopMaintenanceTimers(timers);
308+});
253309});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。