There are no staged changes to summarize. The working tree is clean and git diff --cached returned nothing.
This commit is contained in:
@@ -131,17 +131,35 @@ export async function setStickerInCache(
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function evictIfNeeded(newSize: number): Promise<void> {
|
async function evictIfNeeded(newSize: number): Promise<void> {
|
||||||
while (statsCache.totalSizeBytes + newSize > MAX_SIZE_BYTES) {
|
if (statsCache.totalSizeBytes + newSize <= MAX_SIZE_BYTES) return;
|
||||||
const oldest = await executeGet(
|
|
||||||
"SELECT name, size FROM sticker_cache ORDER BY fetched_at ASC LIMIT 1",
|
const targetToFree = statsCache.totalSizeBytes + newSize - MAX_SIZE_BYTES;
|
||||||
);
|
|
||||||
if (!oldest) break;
|
// Batch eviction: identify all rows to delete, then DELETE in one query.
|
||||||
await executeAll("DELETE FROM sticker_cache WHERE name = ?", [
|
const rowsToEvict = await executeAll(
|
||||||
oldest.name,
|
"SELECT name, size FROM sticker_cache ORDER BY fetched_at ASC",
|
||||||
]);
|
);
|
||||||
statsCache.totalSizeBytes -= Number(oldest.size);
|
if (!rowsToEvict || rowsToEvict.length === 0) return;
|
||||||
statsCache.entryCount--;
|
|
||||||
|
const namesToDelete: string[] = [];
|
||||||
|
let freed = 0;
|
||||||
|
for (const row of rowsToEvict as Array<{ name: string; size: number }>) {
|
||||||
|
namesToDelete.push(row.name);
|
||||||
|
freed += Number(row.size);
|
||||||
|
if (freed >= targetToFree) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await executeAll(
|
||||||
|
`DELETE FROM sticker_cache WHERE name = ANY($1)`,
|
||||||
|
[namesToDelete],
|
||||||
|
);
|
||||||
|
statsCache.totalSizeBytes -= freed;
|
||||||
|
statsCache.entryCount -= namesToDelete.length;
|
||||||
|
|
||||||
|
logger.debug(
|
||||||
|
{ entriesRemoved: namesToDelete.length, freedBytes: freed },
|
||||||
|
"Batch-evicted sticker cache entries",
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user