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
3.1 KiB
3.1 KiB
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 wiededup/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 überUPDATE ... RETURNINGunter 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):
newUIDValidityerzeugt den Wert selbst (Unix-Nanosekunden, garantiert > 0), statt einen extern gelieferten Wert unbesehen zu übernehmen. - Kein Umbau:
mail/internal/imap(ING-01) unverändert —folderstateist ein eigenständiges Paket, das ING-01 künftig (IMP-01) alsMailboxStore-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.