Changeset 4ae254a in Klonkt for src/config/database.js


Ignore:
Timestamp:
10/26/2026 01:07:44 PM (26 hours ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
31288dc
Parents:
5d0d3f35
Message:

Bezorging voor een Klonkt die niet altijd aan staat: leeftijd, offline, per server

De uitgaande helft van shaer-xzab (Bart, 26-10): een Klonkt op een Mac thuis
slaapt, gaat de trein in, staat een weekend uit, en de bezorgwachtrij was daar
niet op gebouwd.

xzab.1 Verlopen op LEEFTIJD (5 dagen sinds created_at), niet na zes pogingen.
Zes pogingen waren ~4,5 uur, en de trede van 360 minuten werd nooit gebruikt:
de telling was er eerder. Treden nu 1m, 5m, 15m, 1u, 3u, 6u, 12u, dan elke 24u.

xzab.2 Offline zijn kost geen pogingen. Faalt een hele beurt op netwerkniveau
(geen enkel HTTP-antwoord) naar meer dan één server, dan ligt het aan ons:
alles twee minuten opschuiven, de telling ongemoeid, en niets laten verlopen.
Bij één server is "hij ligt eruit" net zo waarschijnlijk, dus dat telt gewoon,
en een SSRF-weigering is een besluit en geen netwerkfout.

xzab.3 Backoff per server, volgorde per inbox. Eén mislukking naar een server
schuift al zijn rijen op (nieuwe kolom ap_delivery.host, met een eenmalige
backfill), in plaats van dertig rijen met elk acht seconden time-out op
dezelfde dode server. Per inbox gaat de oudste eerst -- en ook het directe
versturen in deliverWithRetry wacht als er voor die inbox nog iets in de rij
staat, of als die server in zijn backoff zit. Anders kwam een Delete aan vóór
de Create die nog wachtte, en stond de post daarna weer op die server.

test/delivery-queue.test.js: twaalf toetsen tegen echte HTTP-servers en dichte
poorten. Twaalf mutaties apart gedraaid, elk gevangen; één toets bleek eerst
gemaskeerd (de backoff hield tegen wat de volgorde moest tegenhouden) en is
aangescherpt. Volledige suite 1362 groen.

Nog open in het epic: xzab.6 (wat zet bij Mastodon e.a. een domein terug op
beschikbaar), en daarna het wakker worden, xzab.4 en xzab.5.

Niet in deze ronde: drie plekken versturen zelf direct en zetten pas bij een
mislukking in de rij (guardianship/delivery.js, ActivityPubService bij een
antwoord en bij het wissen van een reactie). Die gaan niet langs de volgorde
per inbox.

Co-Authored-By: Claude Opus 5.5 <noreply@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/config/database.js

    r5d0d3f35 r4ae254a  
    888888    );
    889889    CREATE INDEX IF NOT EXISTS idx_ap_reports_slug ON ap_reports(slug, created_at);
     890  `);
     891  // De bezorgwachtrij per SERVER en per INBOX (shaer-xzab.3). `host` zodat één
     892  // mislukking naar een server al zijn rijen opschuift, in plaats van dertig
     893  // rijen met elk acht seconden time-out op dezelfde dode server; de index op
     894  // (inbox, id) zodat "oudste eerst per inbox" geen volle scan per rij is.
     895  // Rijen van voor deze kolom krijgen hun host hier, eenmalig.
     896  ensureColumn('ap_delivery', 'host', 'TEXT');
     897  try {
     898    const zonder = db.prepare('SELECT id, inbox FROM ap_delivery WHERE host IS NULL').all();
     899    const zet = db.prepare('UPDATE ap_delivery SET host = ? WHERE id = ?');
     900    for (const r of zonder) {
     901      let h = null;
     902      try { h = new URL(r.inbox).host.toLowerCase(); } catch { /* onleesbaar: blijft null */ }
     903      zet.run(h, r.id);
     904    }
     905  } catch { /* een lege of ontbrekende wachtrij is geen fout */ }
     906  db.exec(`
     907    CREATE INDEX IF NOT EXISTS idx_ap_delivery_inbox ON ap_delivery(inbox, id);
     908    CREATE INDEX IF NOT EXISTS idx_ap_delivery_host ON ap_delivery(host);
    890909  `);
    891910  // "Feature" a followed account: its posts show in the local Cirkel. Heet in de
Note: See TracChangeset for help on using the changeset viewer.