Samenwerken: snapshot-herbaselijning op een niet-nul versie (Fase 0.5, §5.2) #1005

Closed
opened 2026-07-30 20:54:57 +00:00 by brenno · 2 comments
Owner

Vervolg binnen Fase 0.5, bewust uitgesteld bij #996. COLLABORATION.md §5.2.

Waarom. Een deelnemer die bijkomt start nu vanaf de snapshot bij versie 0 (sessie-start) en moet dan de héle op-log sinds het begin opnieuw afspelen. Bij een lange sessie groeit die log onbeperkt: bijkomen wordt traag en duur, en de sidecar dijt uit. §5.2 vraagt daarom om periodieke herbaselijning, 'so a late joiner never replays the whole op log' — de autoriteit schrijft af en toe een verse snapshot bij de huidige versie, en een nieuwe deelnemer start vanaf snapshot + alleen de recente ops.

Wat er nu is. CollabSnapshot.capture(deck, version) accepteert al een versie-argument, maar hostCollabSession legt de baseline altijd bij versie 0 vast. joinCollabSession leest de snapshot, rebaset het lokale deck (applyTo) en start een CollabSession met initialDeck: baseDeck — maar geeft snapshot.version niet door. En CollabSession begint _version altijd op 0. Een snapshot bij versie N kan dus nu niet correct als startpunt dienen: de deelnemer zou ops N+1.. moeten toepassen, terwijl de sessie denkt op 0 te zitten (en dus op v1 wacht). De bestandskop van collab_session_launch.dart benoemt dit al expliciet als vervolg.

Wat er moet.

  1. CollabSession een startversie laten aanvaarden (bv. initialVersion), zodat een follower vanaf de snapshot-versie verder telt en alleen hogere versies toepast; de autoriteit hervat het toekennen vanaf daar.
  2. Herbaselijning door de autoriteit: periodiek (elke N ops of een tijdsinterval) een verse CollabSnapshot.capture(deck, huidigeVersie) naar de sidecar schrijven. writeSnapshot overschrijft al onvoorwaardelijk.
  3. Inhaalslag vanaf de snapshot-versie: joinCollabSession geeft snapshot.version mee als startversie en negeert ops ≤ die versie (nu al deels: de follower dropt lagere versies, maar de sessie moet er wél op starten).
  4. Optioneel: log-compactie — oude op-records tot de snapshot-versie opruimen zodat de sidecar niet blijft groeien. Beslispunt: wél/niet opruimen, en zo ja hoe veilig (een deelnemer die net vóór de compactie een oude snapshot las, mag niet stranden). Raakt de sidecar-opruiming en het volgnummer-model van de store.

Beslispunten. Wanneer herbaselijnen (drempel in ops of tijd)? Wel/niet log-compactie, en hoe race-veilig? Deze twee bepalen de kosten/robuustheid-afweging.

Reikwijdte. collab_session.dart (startversie + versie-hervatting), collab_snapshot.dart/collab_session_launch.dart (herbaselijning + inhaalslag vanaf versie), en de store (optionele compactie). Deelt de notie 'hoogst geobserveerde versie' met de eigenaarsoverdracht (#1004). Raakt het .md niet (P2).

Vervolg binnen Fase 0.5, bewust uitgesteld bij #996. COLLABORATION.md §5.2. **Waarom.** Een deelnemer die bijkomt start nu vanaf de snapshot bij **versie 0** (sessie-start) en moet dan de héle op-log sinds het begin opnieuw afspelen. Bij een lange sessie groeit die log onbeperkt: bijkomen wordt traag en duur, en de sidecar dijt uit. §5.2 vraagt daarom om periodieke herbaselijning, 'so a late joiner never replays the whole op log' — de autoriteit schrijft af en toe een verse snapshot bij de huidige versie, en een nieuwe deelnemer start vanaf snapshot + alleen de recente ops. **Wat er nu is.** `CollabSnapshot.capture(deck, version)` accepteert al een versie-argument, maar `hostCollabSession` legt de baseline altijd bij versie 0 vast. `joinCollabSession` leest de snapshot, rebaset het lokale deck (`applyTo`) en start een `CollabSession` met `initialDeck: baseDeck` — maar geeft `snapshot.version` **niet** door. En `CollabSession` begint `_version` altijd op 0. Een snapshot bij versie N kan dus nu niet correct als startpunt dienen: de deelnemer zou ops N+1.. moeten toepassen, terwijl de sessie denkt op 0 te zitten (en dus op v1 wacht). De bestandskop van `collab_session_launch.dart` benoemt dit al expliciet als vervolg. **Wat er moet.** 1. **`CollabSession` een startversie laten aanvaarden** (bv. `initialVersion`), zodat een follower vanaf de snapshot-versie verder telt en alleen hogere versies toepast; de autoriteit hervat het toekennen vanaf daar. 2. **Herbaselijning door de autoriteit:** periodiek (elke N ops of een tijdsinterval) een verse `CollabSnapshot.capture(deck, huidigeVersie)` naar de sidecar schrijven. `writeSnapshot` overschrijft al onvoorwaardelijk. 3. **Inhaalslag vanaf de snapshot-versie:** `joinCollabSession` geeft `snapshot.version` mee als startversie en negeert ops ≤ die versie (nu al deels: de follower dropt lagere versies, maar de sessie moet er wél op starten). 4. **Optioneel: log-compactie** — oude op-records tot de snapshot-versie opruimen zodat de sidecar niet blijft groeien. **Beslispunt:** wél/niet opruimen, en zo ja hoe veilig (een deelnemer die net vóór de compactie een oude snapshot las, mag niet stranden). Raakt de sidecar-opruiming en het volgnummer-model van de store. **Beslispunten.** Wanneer herbaselijnen (drempel in ops of tijd)? Wel/niet log-compactie, en hoe race-veilig? Deze twee bepalen de kosten/robuustheid-afweging. **Reikwijdte.** `collab_session.dart` (startversie + versie-hervatting), `collab_snapshot.dart`/`collab_session_launch.dart` (herbaselijning + inhaalslag vanaf versie), en de store (optionele compactie). Deelt de notie 'hoogst geobserveerde versie' met de eigenaarsoverdracht (#1004). Raakt het .md niet (P2).
Author
Owner

Opgepakt. Tak: collab/snapshot-rebaseline. Bouwt voort op #1004 (deelt de notie 'hoogst geobserveerde versie'). Verwachte reikwijdte: collab_snapshot.dart (snapshot krijgt een seq-positie), collab_session.dart (startversie), webdav_async_transport.dart (start-seq zodat een joiner de oude records overslaat), collab_session_launch.dart (joiner start vanaf de laatste snapshot; host-resume threadt de versie/seq door), de herbaselijning + eventuele compactie in de coördinatorlaag, en de store (optionele deletie). Beslispunten herbaselijn-drempel en compactie worden in het ontwerp gewogen. Raakt .md niet (P2).

Opgepakt. Tak: collab/snapshot-rebaseline. Bouwt voort op #1004 (deelt de notie 'hoogst geobserveerde versie'). Verwachte reikwijdte: collab_snapshot.dart (snapshot krijgt een seq-positie), collab_session.dart (startversie), webdav_async_transport.dart (start-seq zodat een joiner de oude records overslaat), collab_session_launch.dart (joiner start vanaf de laatste snapshot; host-resume threadt de versie/seq door), de herbaselijning + eventuele compactie in de coördinatorlaag, en de store (optionele deletie). Beslispunten herbaselijn-drempel en compactie worden in het ontwerp gewogen. Raakt .md niet (P2).
brenno 2026-07-31 08:06:10 +00:00
Author
Owner

Gebouwd en gemergd in #1008 (main 3b2db0d2). De kern van §5.2 zit erin: de snapshot draagt nu zijn log-positie (seq), een nieuwe deelnemer én een terugkerende eigenaar starten sessie + transport vanaf de laatste snapshot (dus alleen de recente records), en de autoriteit schrijft elke N ops een verse basislijn — getriggerd op een ops-teller, geen wandklok. Bijkomen is daarmee snel; de op-log zelf blijft groeien.

Na een implementatie-correctheid-review en een bewaker-review; elke bevinding verwerkt (o.a. de eigenaar-hervatting vanaf een niet-nul snapshot getoetst met version≠seq, en de herbaselijn-test onderscheidt lastSeq van version via een lock).

Bewust uitgesteld (gedocumenteerd in COLLABORATION.md §5.2):

  • Log-compactie om de sidecar-omvang te begrenzen is een apart vervolg: #1007. Dat vraagt een WebDAV-DELETE (nieuwe uitgaande operatie → security-review) en strand-recovery. Deze increment lost de join-snelheid op, niet de log-groei.
  • De snapshot draagt de locktabel niet; een joiner reconstrueert locks alleen uit events ná de basislijn (adviserend, zelfherstellend).
Gebouwd en gemergd in #1008 (main 3b2db0d2). De kern van §5.2 zit erin: de snapshot draagt nu zijn log-positie (seq), een nieuwe deelnemer én een terugkerende eigenaar starten sessie + transport vanaf de laatste snapshot (dus alleen de recente records), en de autoriteit schrijft elke N ops een verse basislijn — getriggerd op een ops-teller, geen wandklok. Bijkomen is daarmee snel; de op-log zelf blijft groeien. Na een implementatie-correctheid-review en een bewaker-review; elke bevinding verwerkt (o.a. de eigenaar-hervatting vanaf een niet-nul snapshot getoetst met version≠seq, en de herbaselijn-test onderscheidt lastSeq van version via een lock). Bewust uitgesteld (gedocumenteerd in COLLABORATION.md §5.2): - **Log-compactie** om de sidecar-omvang te begrenzen is een apart vervolg: **#1007**. Dat vraagt een WebDAV-DELETE (nieuwe uitgaande operatie → security-review) en strand-recovery. Deze increment lost de join-snelheid op, niet de log-groei. - De snapshot draagt de locktabel niet; een joiner reconstrueert locks alleen uit events ná de basislijn (adviserend, zelfherstellend).
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
LibreKAT/Ocideck#1005
No description provided.