Multi-Hoster-Upload/tasks/todo.md
Administrator 38ecc6a4cb perf(queue): coalesce removeFromQueueOnDone removals into one filter pass
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.
2026-04-28 03:37:13 +02:00

1.5 KiB
Raw Permalink Blame History

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.