fix limits

This commit is contained in:
2026-09-13 18:01:58 +02:00
parent 682c0f4971
commit 4315f1fdb3
3 changed files with 209 additions and 14 deletions
+31
View File
@@ -6,6 +6,37 @@ das komplette serverjonas search
- `launcher.py` – startet/überwacht den Crawler und rollt Updates aus (siehe unten)
- `search/` – Suchmaschine darüber (CLI + HTTP-API), siehe [search/README.md](search/README.md)
- `web/` – Statistik-Webseite
- `fix_pages_search_vector_trigger.sql` – einmalig laufen lassen: kappelt den Text,
der im DB-Trigger `pages_search_vector_update()` in `to_tsvector()` einfließt
(Postgres hartes Limit: 1.048.575 Bytes pro `tsvector`)
## Sehr große Seiten / tsvector-Limit
PostgreSQL begrenzt einen einzelnen `tsvector`-Wert hart auf 1.048.575 Bytes
(nicht konfigurierbar). Der Trigger `pages_search_vector_update()` baut diesen
aus der `content`-Spalte – Seiten mit sehr viel Text (beobachtet: ~2 MB, z. B.
`pkg.go.dev/...?tab=importedby`) haben den Insert dadurch mit
`ProgramLimitExceeded` abgebrochen und alle Worker crashen lassen.
Dagegen wirken drei Maßnahmen zusammen:
1. **DB-Trigger (empfohlen, einmalig einspielen):**
`fix_pages_search_vector_trigger.sql` ersetzt die Trigger-Funktion so, dass
nur die ersten 200.000 Zeichen in `to_tsvector()` einfließen. Der volle Text
bleibt in `content` gespeichert, nur der Suchindex ist gekürzt. Vor dem
Einspielen die eigene Funktions-Version prüfen:
`SELECT prosrc FROM pg_proc WHERE proname = 'pages_search_vector_update';`
2. **Im Crawler:** `save_page()` kappelt den Inhalt vor dem Insert zusätzlich
auf `CONTENT_INDEX_MAX_CHARS` (200.000 Zeichen) – wirkt sofort, auch ohne
Trigger-Fix. Überlange Seiten werden dann normal gespeichert.
3. **Fehlerbehandlung:** Sollte der Insert trotzdem an einem Datenbank-Limit
scheitern, fängt der Worker `ProgramLimitExceeded` ab, loggt die URL als
Warnung, rollt die Transaktion zurück, markiert den Queue-Eintrag als
`failed` (kein endloses Wiederholen) und läuft weiter, statt zu sterben.
Zusätzlich werden bekannt wertlose URLs (`pkg.go.dev/...?tab=importedby` –
Megabyte-große reine Rückverweis-Listen) über `SKIP_URL_PATTERNS` schon vor dem
Fetch übersprungen und als `done` markiert.
## Rolling Updates (Generation-Mechanismus)