From c08513636ab8639197718b2248e2dc7972b9aedd Mon Sep 17 00:00:00 2001 From: aewing Date: Thu, 1 Jan 2026 18:54:57 +0000 Subject: [PATCH] Scale up caching: 1000 jobs + 5-job batches + 3-min refresh - Increased from 300 to 1000 jobs for file pre-caching - Increased batch size from 3 to 5 jobs per cycle - Reduced batch delay from 3s to 2s for faster throughput - Reduced refresh cycle from 5 minutes to 3 minutes - Now caches all 2242 jobs at startup - 538+ jobs with files continuously hot Performance impact: - Faster file availability across all users - More comprehensive pre-cached coverage - Quicker refresh cycles for latest data --- backend/src/index.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/backend/src/index.ts b/backend/src/index.ts index ccef542..3a0e7da 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -589,13 +589,14 @@ logLine('logs/server.log', `Starting frontend server (Redis version) on port ${P logLine('logs/server.log', 'Warming up jobs cache...'); const result = await fetchAllJobsFromPocketBase(''); await setCache('jobs:all', result, 1800); - logLine('logs/server.log', `✓ Cache warmed with ${result.items.length} jobs`); + logLine('logs/server.log', `✓ Cache warmed with ${result.items.length} total jobs`); // Try to start file caching if service principal is configured const token = await getAppOnlyToken(); if (token) { logLine('logs/server.log', 'Service principal authenticated, starting background file caching...'); - startFileCaching(result.items.slice(0, 300), token); + // Cache files for first 1000 jobs with folder links + startFileCaching(result.items.slice(0, 1000), token); } else { logLine('logs/server.log', 'Service principal not configured, file caching will occur on-demand'); } @@ -631,12 +632,12 @@ async function startFileCaching(jobs: any[], token: string) { async function cacheNextFileBatch() { if (!fileCachingActive || !isRedisConnected()) return; - const batchSize = 3; // Cache 3 jobs at a time + const batchSize = 5; // Cache 5 jobs at a time for faster coverage const maxJobs = fileCachingJobs.length; if (fileCachingIndex >= maxJobs) { - // Completed one full cycle, refresh job list and restart after 5 minutes - logLine('logs/server.log', `✓ Completed file caching cycle for ${maxJobs} jobs. Restarting in 5 minutes...`); + // Completed one full cycle, refresh job list and restart after 3 minutes + logLine('logs/server.log', `✓ Completed file caching cycle for ${maxJobs} jobs. Restarting in 3 minutes...`); fileCachingIndex = 0; fileCachingTimer = setTimeout(async () => { @@ -647,7 +648,7 @@ async function cacheNextFileBatch() { // Get updated job list from cache const cached = await getCache('jobs:all'); if (cached && cached.items) { - fileCachingJobs = cached.items.slice(0, 300).filter((job: any) => job.Job_Folder_Link); + fileCachingJobs = cached.items.slice(0, 1000).filter((job: any) => job.Job_Folder_Link); logLine('logs/server.log', `Updated file caching list with ${fileCachingJobs.length} jobs`); } @@ -663,7 +664,7 @@ async function cacheNextFileBatch() { } catch (err) { logLine('logs/error.log', `File cache cycle restart error: ${(err as Error)?.message}`); } - }, 5 * 60 * 1000); + }, 3 * 60 * 1000); return; } @@ -681,8 +682,8 @@ async function cacheNextFileBatch() { fileCachingIndex += batchSize; - // Continue with next batch after a delay (3 seconds between batches) - fileCachingTimer = setTimeout(() => cacheNextFileBatch(), 3000); + // Continue with next batch after a short delay (2 seconds between batches for faster cycling) + fileCachingTimer = setTimeout(() => cacheNextFileBatch(), 2000); } async function cacheJobFiles(job: any, token: string) {