Indexierungs-Worker, der neu archivierte Mails asynchron in den Manticore-Index (SRC-01) einpflegt und Löschungen nachzieht. - indexworker/queue.go: Postgres-Jobqueue (mail_index_jobs), FOR UPDATE SKIP LOCKED, Stale-Lock-Wiedervorlage bei Worker-Absturz, arithmetischer Backoff bei Fail (kein String-Concat für Intervalle) — Konvention aus dms/internal/jobqueue (FDN-04), hier bewusst ohne DLQ (nicht Bestandteil der Akzeptanzkriterien dieser Kachel). - indexworker/worker.go: RunOnce verarbeitet index-/delete-Jobs über search.Client. - search: minimale Erweiterung um Client.Delete und deterministisches DocumentID(tenantSlug, messageID), damit Index/Delete für dieselbe Mail immer dasselbe Dokument treffen. Prüfungen (alle real durchgeführt, siehe mail/docs/SRC-02-PRUEFPROTOKOLL.md): 1. TestDequeue_WorkerCrashMidRunLosesNoJob: simulierter Worker-Absturz, Job wird nach Ablauf der Stale-Lock-Frist real erneut zugestellt. 2. TestDeleteJob_RemovesMailFromSearchResults: Lösch-Job entfernt Mail nachweislich aus Suchtreffern. 3. TestConsistency_DatabaseAndIndexMatchOnSample: DB-Job-Status und Index-Inhalt stichprobenartig real abgeglichen. Zusätzlich TestIndexJob_MakesMailSearchable für Akzeptanzkriterium 1. Kein Umbau: storage/crypto/encstorage/dedup unverändert, bestehendes SRC-01-Verhalten unverändert. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HhgFcLS8tYMhDJpP74C6AQ
3.3 KiB
3.3 KiB
SRC-02 – Prüfprotokoll: Indexierungs-Worker & Synchronisierung
Voraussetzung SRC-01, ARC-03 (beide Fertig).
Umsetzung
mail/internal/indexworker/migrations/0001_mail_index_jobs.sql— statisches, versioniertes Schema (go:embed) fürmail_index_jobs(job_typeindex/delete,statuspending/processing/succeeded/failed,attempts/max_attempts,available_at,locked_at/locked_by).mail/internal/indexworker/queue.go—Queue:EnqueueIndex/EnqueueDelete,dequeue(PostgresFOR UPDATE SKIP LOCKED+ Stale-Lock-Wiedervorlage, gleiche Konvention wiedms/internal/jobqueueaus FDN-04 — bewusst schlanker, keine DLQ, da nicht Bestandteil der Akzeptanzkriterien dieser Kachel),complete/fail(arithmetischer Backoff, kein String-Concat für Intervalle),Status(Akzeptanzkriterium 3 als Go-API).mail/internal/indexworker/worker.go—Worker.RunOnce: holt einen Job, ruft je nachjob_typesearch.Client.Index/search.Client.Deleteauf, markiert abschließendcomplete/fail.mail/internal/search: minimale Erweiterung umClient.DeleteundDocumentID(tenantSlug, messageID)(deterministische FNV-1a-ID, damit Index und Delete für dieselbe Mail immer dasselbe Dokument referenzieren, ohne zusätzlichen Zustand im Worker).- Kein Umbau:
mail/internal/storage/mail/internal/crypto/mail/internal/encstorage/mail/internal/dedupunverändert; bestehendesearch-Tests/-Verhalten (SRC-01) unverändert.
Prüfungen
| # | Prüfung | Ergebnis |
|---|---|---|
| 1 | Test: Worker-Neustart mitten im Lauf verliert keinen offenen Auftrag | bestanden – TestDequeue_WorkerCrashMidRunLosesNoJob: Job wird geholt und NICHT abgeschlossen (simulierter Absturz), vor Ablauf der Stale-Lock-Frist real kein zweiter Job verfügbar, nach Ablauf real erneut derselbe Job an einen zweiten Worker zugestellt |
| 2 | Test: Löschung einer Mail entfernt sie zuverlässig aus Suchtreffern | bestanden – TestDeleteJob_RemovesMailFromSearchResults: Mail indexiert und Auffindbarkeit real bestätigt, danach Lösch-Job verarbeitet, anschließende Suche liefert real keinen Treffer mehr |
| 3 | Konsistenztest vergleicht Datenbankbestand mit Indexbestand stichprobenartig | bestanden – TestConsistency_DatabaseAndIndexMatchOnSample: 3 Index-Jobs verarbeitet, je Stichprobe real geprüft, dass der DB-Job-Status succeeded UND das zugehörige Dokument tatsächlich im Manticore-Index auffindbar sind |
Zusätzlich (Akzeptanzkriterium 1, Funktionsnachweis): TestIndexJob_MakesMailSearchable
— eingereihte Indexierungsaufgabe macht die Mail nach Worker-Verarbeitung
real durchsuchbar.
Build/Test-Ergebnis (192.168.1.131)
go build ./... -> clean
go vet ./... -> clean
golangci-lint run ./... -> 0 issues
TEST_TENANT_DSN=postgresql://nexarch_test:***@localhost:5432/tenant_acme?sslmode=disable \
TEST_MANTICORE_URL=http://127.0.0.1:9308 \
go test ./... -v -p 1 -> alle Pakete bestanden, inkl. internal/indexworker (5 Tests)
Gesamtergebnis
Bestanden. Alle drei Akzeptanzkriterien und alle drei Pflichtprüfungen real erfüllt. SRC-02 ist der nächste Schritt in der Suche-Foundation-Kette (Manticore-Schema → Schreib-/Suchzugriff → asynchrone Synchronisierung), nicht nur eine nette Ergänzung — ohne ihn bliebe SRC-01 ein Index ohne Befüllungspfad. Entsperrt QA-03.