ING-05: folder-state-uidvalidity-handling
Folder-State-Verwaltung inklusive UIDVALIDITY/UIDNEXT-Handling (RFC 3501 §2.3.1.1), damit Clients und Importvorgänge konsistente Sichten erhalten. Direkte Vorbedingung für IMP-01. - store.go: GetOrCreate/CurrentState konsistent bei parallelem Zugriff (INSERT ON CONFLICT + Rücklese). NextUID vergibt UIDs atomar über UPDATE...RETURNING unter Zeilensperre, protokolliert jede Vergabe. Rebuild garantiert über GREATEST(uidvalidity+1, jetzt) eine strikt neue UIDVALIDITY auch bei Neuaufbauten innerhalb derselben Nanosekunde, setzt UIDNEXT zurück auf 1. RecordDeletion ändert UIDNEXT nicht (UIDs werden nie wiederverwendet). - Bekannten Fehler vermieden (archivmail: UIDVALIDITY=0 bricht Resync): UIDVALIDITY wird selbst erzeugt (Unix-Nanosekunden), nie von außen übernommen. - Kein Umbau: mail/internal/imap (ING-01) unverändert, folderstate ist eigenständig und kann künftig (IMP-01) als MailboxStore-Implementierung dienen. Prüfungen (alle real durchgeführt, siehe mail/docs/ING-05-PRUEFPROTOKOLL.md): 1. TestRebuild_ChangesUIDValidityOnSimulatedFolderRebuild: UIDVALIDITY real geändert, UIDNEXT real zurückgesetzt, Ereignis real protokolliert. 2. TestNextUID_ConcurrentSessionsOnSameFolderNoInconsistency: 20 reale gleichzeitige Vergaben, 0 Dopplungen. 3. TestNextUID_MonotonicAcrossManyInsertDeleteCycles: 200 Zyklen real strikt monoton, Löschungen ohne Einfluss auf UIDNEXT. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HhgFcLS8tYMhDJpP74C6AQ
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
54c5f74778
commit
0d3779d03e
@@ -0,0 +1,57 @@
|
||||
# ING-05 – Prüfprotokoll: Folder-State & UIDVALIDITY-Handling
|
||||
|
||||
Voraussetzung ING-01 (Fertig). ING-05 ist die direkte Vorbedingung für
|
||||
IMP-01 (gemeinsam mit ING-01, bereits Fertig) — ohne ING-05 bleibt IMP-01
|
||||
weiterhin blockiert.
|
||||
|
||||
## Umsetzung
|
||||
|
||||
- `mail/internal/folderstate/store.go` — `Store` (Postgres,
|
||||
`mail_folder_state` + `mail_folder_state_events`, gleiches Muster wie
|
||||
`dedup`/`indexworker`/`savedsearch`):
|
||||
- `GetOrCreate`/`CurrentState`: konsistente Sicht bei parallelem Zugriff
|
||||
(Akzeptanzkriterium 2) — `INSERT ... ON CONFLICT DO NOTHING` +
|
||||
Rücklese, kein Lese-dann-Schreib-Fenster.
|
||||
- `NextUID`: vergibt UIDs atomar über `UPDATE ... RETURNING` unter
|
||||
Postgres-Zeilensperre (Akzeptanzkriterium 1/3), protokolliert jede
|
||||
Vergabe als Ereignis in derselben Transaktion.
|
||||
- `Rebuild`: simulierter Ordner-Neuaufbau — `GREATEST(uidvalidity + 1,
|
||||
jetzt_in_ns)` garantiert eine STRENG neue UIDVALIDITY, auch wenn zwei
|
||||
Neuaufbauten innerhalb derselben Nanosekunde laufen; UIDNEXT wird auf
|
||||
1 zurückgesetzt.
|
||||
- `RecordDeletion`/`Events`: Löschungen ändern UIDNEXT nicht (RFC 3501:
|
||||
UIDs werden nie wiederverwendet), alle Zustandsänderungen bleiben
|
||||
nachvollziehbar (Akzeptanzkriterium 3).
|
||||
- Bekannten Fehler vermieden (archivmail: UIDVALIDITY=0 bricht Resync bei
|
||||
nicht-konformen Servern): `newUIDValidity` erzeugt den Wert selbst
|
||||
(Unix-Nanosekunden, garantiert > 0), statt einen extern gelieferten
|
||||
Wert unbesehen zu übernehmen.
|
||||
- Kein Umbau: `mail/internal/imap` (ING-01) unverändert — `folderstate`
|
||||
ist ein eigenständiges Paket, das ING-01 künftig (IMP-01) als
|
||||
`MailboxStore`-Implementierung nutzen kann, ohne dass ING-01 selbst
|
||||
angefasst werden musste.
|
||||
|
||||
## Prüfungen
|
||||
|
||||
| # | Prüfung | Ergebnis |
|
||||
|---|---|---|
|
||||
| 1 | Automatisierter Test für UIDVALIDITY-Änderung bei simuliertem Ordner-Neuaufbau | **bestanden** – `TestRebuild_ChangesUIDValidityOnSimulatedFolderRebuild`: Ordner angelegt, UID vergeben, `Rebuild` aufgerufen — UIDVALIDITY real geändert, UIDNEXT real auf 1 zurückgesetzt, `rebuilt`-Ereignis real protokolliert |
|
||||
| 2 | Nebenläufigkeitstest: zwei Sessions auf demselben Ordner ohne Inkonsistenz | **bestanden** – `TestNextUID_ConcurrentSessionsOnSameFolderNoInconsistency`: 20 reale gleichzeitige `NextUID`-Aufrufe auf demselben Ordner, alle 20 UIDs real eindeutig, keine Dopplung |
|
||||
| 3 | Test für UIDNEXT-Monotonie über viele Einfüge-/Löschzyklen | **bestanden** – `TestNextUID_MonotonicAcrossManyInsertDeleteCycles`: 200 Zyklen, jede zweite Nachricht real "gelöscht" — UIDNEXT bleibt real strikt monoton steigend, Löschungen beeinflussen die Vergabe nicht |
|
||||
|
||||
## Build/Test-Ergebnis (192.168.1.131)
|
||||
|
||||
```
|
||||
go build ./... -> clean
|
||||
go vet ./... -> clean
|
||||
golangci-lint run ./... -> 0 issues
|
||||
TEST_TENANT_DSN=... go test ./internal/folderstate/... -v -> 3/3 bestanden
|
||||
TEST_TENANT_DSN=... TEST_MANTICORE_URL=... go test ./... -p 1
|
||||
-> alle 13 Pakete bestanden, keine Regression
|
||||
```
|
||||
|
||||
## Gesamtergebnis
|
||||
|
||||
**Bestanden.** Alle drei Akzeptanzkriterien und alle drei Pflichtprüfungen
|
||||
real erfüllt. Entsperrt IMP-01 (gemeinsam mit ING-01, bereits Fertig) und
|
||||
ING-10.
|
||||
Reference in New Issue
Block a user