fix(hub): één vervanger per storing voor de question-listener #173
No reviewers
Labels
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
janpeter/Scrum4Me!173
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "fix/hub-question-listener-generation"
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?
Waarom
Een
pg.Clientemit bij één beëindiging zowel'error'als'end'. InstartQuestionListenerwaren die allebei aanreconnect()gekoppeld, zonder guard en zonder de voorganger te sluiten:Elke storing leverde dus twee levende vervangers op, en die verdubbelden bij de volgende storing opnieuw.
Dit lag te slapen zolang niets idle verbindingen opruimde. Sinds
idle_session_timeoutop de database staat wordt de listener elke 15 minuten gereapt, en groeide het in golven door. Gemeten op prod: 27 gelijktijdigeLISTEN scrum4me_changes-connecties uit één web-proces, stabiel, terwijl de multiplexer van #172 er één hoort te houden. Het log bevestigt het mechanisme — 45× "idle-session timeout" naast 48× "Connection terminated unexpectedly", dus twee events per beëindiging, in foutgolven op precies 15 minuten afstand.Een herstart van de web-app zette het terug op 1, wat de diagnose sluit: het is accumulatie, geen momentopname.
Wat deze PR doet
Hetzelfde patroon als de queue-listener-fix in #172 — voorganger sluiten plus een generatieteller — en aanvullend een
scheduled-vlag per generatie.Die vlag is nodig omdat de generatieteller alléén een gat laat: vuurt dezelfde client twee keer vóórdat de vervanger daadwerkelijk draait, dan is de generatie nog ongewijzigd en passeren beide events de check. Dat gat zat ook nog in de queue-listener uit #172 en is hier meteen meegenomen.
Verificatie
Drie regressietests, met positieve controle:
expected [ …(3) ] to have a length of 2expected false to be trueZe falen dus aantoonbaar zonder de fix; een regressietest die ook op de oude code slaagt bewaakt niets.
Verder:
npm run typecheck296 fouten mét én zónder, met genormaliseerde regelnummers identieke verzameling.npm test17 falende regels mét én zónder — niets nieuw, niets stilletjes opgelost. Beide getallen zijn pre-existing in de dev-clone (stale generated client / dirty submodule).eslintop het gewijzigde bestand: exit 0.Kanttekening bij mijn eigen eerdere inschatting
In #172 schreef ik over deze listener: "functioneel zelfherstellend, maar onnodige churn — kandidaat voor een volgende PR." Dat was te mild. Het is geen churn maar vermenigvuldiging, en de
idle_session_timeoutdie ik dezelfde dag zette was er de trigger voor.Verdict: APPROVED
Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.
Findings
Reviewnotities
De wijziging past bij de hub-runtime ontwerp-eis uit de communicatiecentrum-spec: één in-proces runtime met eigen reconnect/backoff en graceful shutdown. De nieuwe
questionListenerGenerationplus lokalescheduled-guard voorkomt dubbele vervangers wanneer één pg-client zowelerroralsendemit, en sluit de vorige LISTEN-client expliciet af voordat een vervanger actief wordt. De queue-listener krijgt dezelfde dedupe tegen herhaalde error-events binnen dezelfde generatie.De toegevoegde Vitest-regressietest dekt de kernscenario's: één vervanger bij
error+end, afsluiten van de voorganger, en late events van een vervangen client. Ik kon geen lokale test run uitvoeren omdat de workspace geen checkout bevatte, maar de aangeleverde diff is coherent en plan-onafhankelijk beoordeelbaar.