ceskaexpedice / kramerius

System Kramerius
GNU General Public License v3.0
45 stars 26 forks source link

K7 / Po reštartovaní Postgres-u sa skeny načítajú rozmazané #1072

Closed r2it-git closed 1 month ago

r2it-git commented 1 month ago

Ahoj,

narazili sme na chybu, kedy po výpadku (a reštartovaní) Postgresu sa k nemu už Kramérius nevie správne pripojiť.

V logoch sa síce nachádza riadok com.zaxxer.hikari.pool.HikariPool.checkFailFast HikariPool-1 - Added connection org.postgresql.jdbc.PgConnection@e6118a2, ale následne requesty na Kramérius failujú s príčinou 21-Jul-2024 14:59:12.349 SEVERE [http-nio-8080-exec-7] cz.incad.kramerius.auth.thirdparty.ExtAuthFilter.doFilter Request cannot be executed; I/O reactor status: INACTIVE java.lang.IllegalStateException: Request cannot be executed; I/O reactor status: INACTIVE. Orezané logy na čas kedy táto chyba nastala prikladám k tomuto issue.

Po tejto chybe beží Kramérius na oko správne, čo sme si všimli u nás v MZK je, že keď táto chyba nastane, tak sa skeny nenačítajú úplne, ostanú rozmazané. Na ukážku som to zreplikoval v našom dev Kramériu. Replikácia tejto chyby je v celku jednoduchá, stači buď zapnúť najskôr Kramérius a potom Postgres, alebo počas behu Kraméria postgres zreštartovať.

Predpokladám, že pri tejto chybe môže byť ovplyvnená aj iná funkcionalita Kraméria, ktorá závisí na komunikácií s postgresom, ale netestoval som to.

Pri replikácií tejto chyby som zistil, že vo verzií 7.0.34 nenastáva. Podarilo sa mi ju zreplikovať iba vo verzií 7.0.35.

Randiak - MZK

catalina.2024-07-21.log

Edit: live logy sú k dispozícií tu.

r2it-git commented 1 month ago

Zreštartoval som ten dev Kramérius (testoval som tam konfiguráciu), a už sa mi to nedarí zreplikovať. Včera sa mi to podarilo 3 krát za sebou tak, že som zapol naraz Kramérius aj postgres, ale teraz nabehne bez problémov. Tak predpokladám, že to závisí na nejakom súbehu viacerých udalostí, a kľudne sa to môže stávať aj na starších verziách, akurát som mal včera "šťastie" a nastala táto chyba iba vo verzií 7.0.35.

vlahoda commented 1 month ago

Podle toho prilozeneho logu ten problem nastava, kdyz neni postgres dostupny pri startu Tomcatu - ve startup sekvenci neni tahle situace spravne osetrena a uz se proto nenastartuji nektere dalsi sluzby (process scheduler, CDK kanal a hlavne AsyncHttpClient, pres ktery se nacitaji dlazdice z image serveru a ktery pak hlasi tu chybu I/O reactor status: INACTIVE). To opravime, workaround je ale zatim jednoduchy - startovat tomcat az jako posledni.

Pokud se ale postgres vypne a restartuje uz pri spravne bezicim Tomcatu, nedari se nam ten problem replikovat a neni mi ani jasne, jak by to ten AsyncHttpClient mohlo ovlivnit

r2it-git commented 1 month ago

@vlahoda teraz sa mi to podarilo zreplikovať už na bežiacom tomcate (v dev Kramériu). catalina.2024-07-31.log

Edit: 31-Jul-2024 07:21:05.619 - som otvoril stránku a tá sa správne načítala. 31-Jul-2024 07:29:55.609 - som zreštartoval postgres. Odvtedy sa ostatné stránky načítajú rozmazané. Tá prvá sa načíta správne, ale predpokladám, že to bude asi kvôli nejakej cache.

vlahoda commented 1 month ago

Podle toho logu je ale zrejme, ze se Tomcat startoval pri nedostupne databazi a na radku 286 je prave videt, ze problem nastal v te inicializacni sekvenci cz.incad.Kramerius.StartupServlet.init(StartupServlet.java:81) - pak uz se nenastartoval ten http klient a pomuze jedine novy restart tomcatu

r2it-git commented 1 month ago

Aha, vidím to. Akurát nechápem prečo sa tá jedna stránka načítala a ostatné potom už nie. V produkcií sa nám to stalo iba pri reštarte postgresu aj Kramériu naraz, takže je možné, že som to nesprávne vyhodnotil keď som sa to snažil zreplikovať a nastáva to len pri štarte.

vlahoda commented 1 month ago

nechápem prečo sa tá jedna stránka načítala a ostatné potom už nie

jedine vysvetleni je cache browseru

vlahoda commented 1 month ago

V kazdem pripade: i kdyz tuhle konkretni chybu pri startu opravime, musi se sluzby startovat ve spravnem poradi. Nevim, jak to mate resene v Kubernetes, ale v docker compose to resime definovanim zavislosti mezi kontejnery - u kontejneru, ktere startuji dlouho (solr, keycloak) je nastavena navic podminka, ze nestaci jen spusteni kontejneru, ale ze projde health check.

Priklad:

services:
  kramerius:

  ...

  depends_on:
      iipimage:
        condition: service_started
      memcached:
        condition: service_started
      imageserver:
        condition: service_started
      audioserver:
        condition: service_started
      solr:
        condition: service_healthy
      krameriusPostgres:
        condition: service_started
      keycloak_eduid:
        condition: service_healthy