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.
26 lines
1.5 KiB
Markdown
26 lines
1.5 KiB
Markdown
# 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.querySelectorAll` bei 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-row` transition** auf `:hover` scopen (aktuell auf jedem row → unnötiger Repaint bei Status-Flip).
|
||
- [ ] Module-level Sets `_sessionTrackedJobs`/`_sessionDoneJobs`/`_completedUploadKeys` werden nie geleert — minor memory growth.
|
||
|
||
## Loop-Notes
|
||
- Cron-Job `01e33ae1` läuft alle 30min (:07/:37), Session-only.
|
||
- Pro Iteration: GENAU EIN Issue. Auto-Release bei grünen Tests. Boundary: keine Features, keine Major-Refactors.
|