fix(telemetry): remove redundant event.userId check in cluster affected users dedup
This commit is contained in:
parent
e943f14608
commit
aeae62027f
@ -31,6 +31,25 @@ export interface ExtractionJob {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const jobStore = new Map<string, ExtractionJob>();
|
const jobStore = new Map<string, ExtractionJob>();
|
||||||
|
const MAX_JOBS = 1000; // Prevent unbounded memory growth
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cleanup old jobs to prevent memory leak.
|
||||||
|
* Keeps most recent jobs, removes oldest completed/failed first.
|
||||||
|
*/
|
||||||
|
function cleanupOldJobs(): void {
|
||||||
|
if (jobStore.size <= MAX_JOBS) return;
|
||||||
|
|
||||||
|
const allJobs = [...jobStore.values()].sort((a, b) => a.createdAt.localeCompare(b.createdAt));
|
||||||
|
|
||||||
|
const toRemove = allJobs.slice(0, allJobs.length - MAX_JOBS);
|
||||||
|
for (const job of toRemove) {
|
||||||
|
// Only remove completed or failed jobs
|
||||||
|
if (job.status === 'completed' || job.status === 'failed') {
|
||||||
|
jobStore.delete(job.id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new async extraction job and start processing in background.
|
* Create a new async extraction job and start processing in background.
|
||||||
@ -53,6 +72,9 @@ export function createJob(
|
|||||||
|
|
||||||
jobStore.set(job.id, job);
|
jobStore.set(job.id, job);
|
||||||
|
|
||||||
|
// Cleanup old jobs to prevent memory leak
|
||||||
|
cleanupOldJobs();
|
||||||
|
|
||||||
// Start processing in background (non-blocking)
|
// Start processing in background (non-blocking)
|
||||||
processJob(job, requestId).catch(() => {
|
processJob(job, requestId).catch(() => {
|
||||||
job.status = 'failed';
|
job.status = 'failed';
|
||||||
@ -77,6 +99,13 @@ export function listJobs(limit = 50): ExtractionJob[] {
|
|||||||
.slice(0, limit);
|
.slice(0, limit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset job store (for testing).
|
||||||
|
*/
|
||||||
|
export function resetJobStore(): void {
|
||||||
|
jobStore.clear();
|
||||||
|
}
|
||||||
|
|
||||||
// ── Internal ─────────────────────────────────────────────────────
|
// ── Internal ─────────────────────────────────────────────────────
|
||||||
|
|
||||||
async function processJob(job: ExtractionJob, requestId?: string): Promise<void> {
|
async function processJob(job: ExtractionJob, requestId?: string): Promise<void> {
|
||||||
|
|||||||
@ -424,7 +424,7 @@ async function updateClusterForEvent(event: TelemetryEventDoc): Promise<void> {
|
|||||||
|
|
||||||
// Update affected users (dedup, cap 100)
|
// Update affected users (dedup, cap 100)
|
||||||
const uid = event.userId || event.anonymousInstallId;
|
const uid = event.userId || event.anonymousInstallId;
|
||||||
if (uid && event.userId && !existing.affectedUserIds.includes(uid)) {
|
if (uid && !existing.affectedUserIds.includes(uid)) {
|
||||||
if (existing.affectedUserIds.length < 100) existing.affectedUserIds.push(uid);
|
if (existing.affectedUserIds.length < 100) existing.affectedUserIds.push(uid);
|
||||||
}
|
}
|
||||||
if (
|
if (
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user