| id | REF-048 | ||||||
|---|---|---|---|---|---|---|---|
| workflow | github | ||||||
| github_issue | emulebb/emulebb#101 | ||||||
| title | Reduce queue and tracking scan cost without policy drift | ||||||
| status | OPEN | ||||||
| priority | Minor | ||||||
| category | refactor | ||||||
| labels |
|
||||||
| milestone | post-0.7.3 | ||||||
| created | 2026-05-27 | ||||||
| source | senior C++ performance and I/O review of up/down clients and queues |
Workflow status is tracked in GitHub: emulebb/emulebb#101. This local document is retained as an engineering spec/evidence record.
Several active queue and tracking paths still pay avoidable linear-scan or repeated-selection costs. The safe opportunity is to reduce scan work while preserving the existing queue policy, network timing, packet order, and stale entry semantics.
This is a small refactor lane, not a queue-policy rewrite.
CDownloadQueuelocal server source-request selection repeatedly searches for the next best request, effectivelyO(15 * N)for the current batch.- Kad packet tracking and callback tracking lists mostly clean expired tail entries during insert paths, so idle periods can leave stale records that are still scanned on later queries.
- Client duplicate/source lookup paths still contain broad linear scans, but the mutable key set makes secondary indexes risky without diagnostics.
CDownloadQueue::SortByPrioritystill usesCList::FindIndexduring heap sorting. This is lower priority because tie-order regressions are easy.
- Factor stale-tail cleanup into Kad packet-tracking and callback-query paths before scans, only removing entries that are already expired by current rules.
- Replace repeated local server source-request selection with a one-pass top-N selection that preserves the same priority and wait-order ties.
- Add targeted counters or debug-only assertions around candidate counts and selected request order before attempting riskier client lookup indexes.
- Consider vector-backed stable priority sorting only after measuring priority resort cost on large download lists.
- Do not change source admission, upload/download scheduling, queue caps, request cadence, retry timing, or server packet format.
- Do not add secondary client indexes until all key mutation points are known and debug-verified.
- Do not snapshot raw client pointers across locks without an explicit lifetime guard.
- Keep any stale-entry cleanup equivalent to entries the current code would already ignore.
- Kad and callback query paths remove expired tail entries before scanning.
- Local server source-request batching chooses the same top 15 files as the current repeated-selection logic for golden queue fixtures.
-
OP_GETSOURCESframe content and ordering remain unchanged for tested fixtures. - Metrics or debug assertions document candidate counts and selected order.
- Client secondary indexes remain deferred unless diagnostics proves a clear hotspot and every key update point is covered.
python -m emule_workspace validate- focused native queue-selection golden tests
- Kad packet-tracking expiry tests
- source-request packet golden comparison
- x64 Debug and Release app builds before commit