feat(collab): log-compactie van de op-log (§5.2, #1007) #1009
No reviewers
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!1009
Loading…
Reference in a new issue
No description provided.
Delete branch "collab/log-compaction"
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?
Closes #1007.
Vervolg op #1005 (COLLABORATION.md §5.2). Herbaselijning maakte bijkomen snel maar
liet de oude op-records staan, zodat de sidecar-op-log onbegrensd bleef groeien.
Deze increment ruimt ze op. De client krijgt hiervoor zijn eerste verwijderende
uitgaande operatie, dus dit is ontworpen na een security-architect-review (F1–F7)
en die eisen zijn hard ingebouwd. Raakt het
.mdniet (P2).Ontwerp
WebdavService.deletegaat langs dezelfdebeveiligde weg als upload/download — de NetGuard-gepinde
HttpClient,followRedirects=false(een 3xx is een fout, nooit "verwijderd"), enuriFor-containment.CollabLogStore.delete(seq)voedt het uitsluitend_pathFor(seq), dus het kan alleen een genummerd recordbestand raken — nooit desnapshot, het baken of het
.md. Idempotent (404 = al weg). Een mislukte deletelaat het record staan (de veilige toestand).
Swistde autoriteit de records die de vorige basislijn al omvatte (≤ die seq). Het
verwijdervenster schuift pas op ná een bevestigd-duurzame snapshot (F1), dus
een mislukte snapshot-schrijf kan het venster nooit verbreden en niemand doen
stranden. Deletes per cyclus begrensd (F5), ná de beacon-heartbeat.
wacht (
!isCaughtUpterwijl de laatste snapshot een hogere versie draagt),herbaselijnt zichzelf: hij leest de snapshot opnieuw en springt sessie + transport
vooruit — alleen vooruit en fail-closed (een stale of half-geschreven
snapshot laat hem staan om het opnieuw te proberen).
Residu (gedocumenteerd)
Bij de zeldzame strand-recovery worden niet-geëchode lokale edits overschreven door
de sprong naar de autoritatieve staat — dezelfde klasse als het §5.3-failover-residu,
aanvaardbaar omdat zo'n deelnemer ver achterlag en her-synchroniseren beter is dan
gestrand blijven.
Reikwijdte
webdav_service.dart(delete),collab_log_store.dart(delete),handover_coordinator.dart(compactie + strand-detectie),collab_session.dart(
rebaseTo, forward-only),webdav_async_transport.dart(jumpTo, forward-only).Geen l10n (onzichtbaar), geen afhankelijkheid.
Toetsing
Ontworpen na een security-architect-ontwerpreview (zeven eisen F1–F7, alle hard
ingebouwd), daarna een security- en een bewaker-diffreview. De diffreview bracht
één echte tekortkoming naar boven: compactie liep op het kritieke pad van de
poll-lus, zodat een reeks trage DELETEs de vólgende heartbeat kon vertragen en
spontane overdracht kon uitlokken. Opgelost door compactie losgekoppeld van de
lus te draaien (niet meer onder
_syncing), plus een test voor het meerdere-passes-pad. Nieuwe tests o.a.: DELETE op het genummerde pad + 404-idempotent + 3xx-als-fout;
compactie wist de records van de vorige basislijn; de F1-stall-guard (een mislukte
snapshot-schrijf compacteert niets); een gestrande deelnemer die via de snapshot
herstelt; fail-closed bij een onleesbare snapshot; en een grote achterstand die over
meerdere begrensde passes wordt geruimd.
make checkgroen,make check-secrets+make sastschoon. Geen goldens (geen rendering).🤖 Generated with Claude Code