handleProgress on a 'done' event with removeFromQueueOnDone=true was calling queueJobs.filter() once per event. With 500 parallel jobs all finishing at roughly the same time, that's 500 × O(N) = O(N²) work synchronously on the IPC handler thread — visible as a brief UI freeze when a big batch completes. Coalesce into one microtask: removeJobFromIndex + selection cleanup stay synchronous (so subsequent lookups see the right state), but the array rewrite is deferred to a single filter against a Set of all ids that came in this tick. JS microtask runs after the sync IPC batch, so within one batch-of-events we get one filter pass instead of N. beforeunload drains the pending set synchronously before persisting so removeFromQueueOnDone=true users don't see jobs reappear after restart that they expected to be gone.
1.5 KiB
1.5 KiB
Verbesserungs-Loop — open items
Released
- ✅ 3.3.0 — Performance-Fixes (queue-cap, sort-throttle, history-delegation, recent-cap) + Log-Recovery
Open items (priorisiert)
Stabilität
- removeFromQueueOnDone O(N²) in
handleProgress(renderer/app.js) — bei 500 gleichzeitig fertig werdenden Jobs 500× ein O(N)-queueJobs.filter()aufgerufen. Coalesce über microtask + Set. - fileuploader.log wächst unbounded — automatische Rotation bei >50MB (rename → .1, neue Datei).
_jobLogCollector(main.js) — wird nur bei start-upload geleert, nicht bei batch-done. Bei vielen Batches ohne neuen start-upload wächst es. Cleanup bei batch-done für jobs die nicht mehr in queueJobs sind.
Performance
applyQueueSelectionClasses(renderer/app.js:891) —tbody.querySelectorAllbei jedem Klick. Bei 5000-Jobs-Queue O(N) per click. Cache last rendered range.
Code-Qualität
- Test-Coverage für 3.3.0 — keine Tests für die queue-cap-prune-Logik in handleBatchDone, sortQueueJobs dynamic-throttle, log-error-recovery.
UX-Politur
- CSS
.queue-rowtransition auf:hoverscopen (aktuell auf jedem row → unnötiger Repaint bei Status-Flip). - Module-level Sets
_sessionTrackedJobs/_sessionDoneJobs/_completedUploadKeyswerden nie geleert — minor memory growth.
Loop-Notes
- Cron-Job
01e33ae1läuft alle 30min (:07/:37), Session-only. - Pro Iteration: GENAU EIN Issue. Auto-Release bei grünen Tests. Boundary: keine Features, keine Major-Refactors.