fix: ograniczenie kolejki roboczej DOI — koniec z OOMKill librariana #15
Reference in New Issue
Block a user
Delete Branch "fix-librarian-oom-workq"
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?
Objaw
Pod librariana restartował się spontanicznie w trakcie wyszukania i całe wyszukanie ginęło. To nie żaden bug logiczny — to OOMKilled: librarian nie ma liveness/readiness probe (więc nie sonda go ubija), a limit pamięci to 1Gi.
Przyczyna (smoking gun)
search_bot.search_for_doitworzył kolejkę robocząQueue(maxsize=35_500_000). Producenci (po jednym na plik-chunk) wlewają całą bazę DOI (dziesiątki mln linii) do tej kolejki, a garstka konsumentów ją opróżnia. Przy 35,5 mln linii × ~100 B to ~3,5 GB buforu — kolejka wysadzała kontener 1Gi na długo przed osiągnięciem limitu, zabierając ze sobą trwające wyszukanie.Fix
CONJURER_LIBRARIAN_WORKQ_SIZE) → producenci robią backpressure do konsumentów, RAM spada do kilku-kilkunastu MB. Zero wpływu na poprawność (wyszukanie i tak się kończy, producent tylko czeka na miejsce).putma teraz timeout i dopytuje o sentinel TERM — więc pełna kolejka, której konsumenci już skończyli (wszystkie DOI znalezione), nie zakleszcza go.Test
test_bounded_queue_does_not_deadlock_on_early_termination: malutka kolejka (3) + cel w pierwszej linii + 5000 śmieci po nim → i tak kończy się i znajduje cel. Suite: 56 unit + 45 integration zielone.Sprawdź na żywo, że to był OOM
(→
OOMKilled), orazkubectl -n conjurer top podw trakcie wyszukania.Uwaga: kolejne potencjalne źródła pamięci (osobno)
cr_results/rr_results/s_results/not_in_db.jsonakumulują każdy wynik na zawsze i są w całościjson.load-owane przy każdym wyszukaniu → rosnący RAM i dysk. Warto to potem obciąć.Proponuję headroom na pamięć (deploy) jako bufor + ewentualnie osobny PR na (2).
🤖 Generated with Claude Code