XMPP: syncNow 1-seconde polling zonder short-circuit — constante CPU op een idle sessie #1423
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck#1423
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Bevinding
lib/xmpp/xmpp_collab_launch.dart—start()(regel 208) start eenTimer.periodicmet een default interval van 1 seconde diesyncNow()aanroept.syncNow()(regels 167–205) draait elke ronde altijd alle retry-functies, zonder short-circuit als er niets veranderd is:presence.retryPending()— itereert alle_pending-entries (regel 171)chat.retryPending()— itereert de hele_pending-lijst (regel 172)keyExchange.ensureKeyed()— itereert alledirectory.knownDevices(regel 174)snapshotChannel.retryPending()— itereert alle_assembled-entries (regel 187)Het design-document noemt "Push, not poll" (regel 13–17) als uitgangspunt — XMPP is push, stanzas arriveren op de demux. Maar de
syncNow-loop is een poll die elke seconde alle buffers opnieuw probeert, ook als er geen nieuwe stanzas zijn aangekomen.Waarom de poll bestaat (en waarom het een performance-probleem is)
De poll is nodig omdat stanzas kunnen aankomen vóórdat de key-state compleet is (een joiner ziet presence/chat vóór zijn keyshare, §6). De
retryPending-functies heropenen gebufferde verzegelingen zodra de sleutel beschikbaar is. Maar als er niets in de buffers staat (_pendingis leeg), is elke ronde pure overhead — een iteratie over een lege collectie en een await per retry-functie.Op een idle sessie (geen activiteit, geen newcomers) draait dit elke seconde 4 async-functies die niets doen. Dat is niet catastrofaal, maar het is onnodige CPU en wakeups — op een laptop betekent het dat de app elke seconde uit idle wordt gehaald.
Trust boundary
Interne logica — geen externe aanvaller. Performance-degradatie op de lange termijn.
Impact
Oplossingsrichting
hasPending-check toe aan elke brick (presence, chat, snapshot, keyExchange). Als geen van alle buffers pending-entries heeft, skip de ronde. Dit is een één-regel guard aan het begin vansyncNow.retryPendingop alle bricks). De poll kan dan vervallen of worden teruggebracht naar een langzame fallback (bijv. elke 30 seconden) voor het geval een signaal wordt gemist.Locatie
lib/xmpp/xmpp_collab_launch.dartregels 167–205 (syncNow), 207–211 (start)lib/xmpp/xmpp_presence_beacon.dartregels 150–154 (retryPending)lib/xmpp/xmpp_chat.dartregels 188–202 (retryPending)lib/xmpp/xmpp_snapshot.dartregels 121–125 (retryPending)lib/xmpp/xmpp_key_exchange.dartregels 154–165 (ensureKeyed)Severity
LOW — onnodige CPU/wakeups, geen crash of data-loss, maar relevant voor batterij-gevoelige targets.