gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1389Shell 137Markdown 80Rust 802602 Definiciones

granja: freno al crashloop del worker — 30 h de OOM y reinicio en bucle

`Restart=always` + `RestartSec=30` sin límite: si una receta no entra en la RAM de la
caja, el OOM killer la mata, systemd relanza a los 30 s, el loop recorre la cola por glob
alfabético y vuelve a la MISMA receta. En el LXC dev.gioser.net eso duró 30 horas con
`clang18`, y dejó la máquina con presión de I/O `full avg300=43` —todo bloqueado en disco
casi la mitad del tiempo— y sshd incapaz de completar el banner. Diagnosticarla desde
fuera era imposible: parecía red o disco. El único rastro eran dos `oom-kill` en el
journal, que sólo se ven desde dentro.

StartLimitBurst=3 / StartLimitIntervalSec=3600: a los 3 arranques en una hora systemd se
rinde y deja la unidad en `failed`, VISIBLE en `systemctl status`. OOMPolicy=stop: un OOM
no es un fallo transitorio, si no entra ahora no entra en 30 segundos.

Rendirse no pierde nada: el hub ya tolera workers ausentes —cosecha-cron dice "siembra
falló" y sigue con el siguiente— y un worker parado y diagnosticable vale más que uno que
se reinicia para siempre.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LykB7vw38b4Ck1Zij15RQ4

588fedebcbb1fbc44cb6839c3b47b0718f9964b1 · por Sergio · (hace 1 mes) · padre c04f2a6e0 · ver el árbol en este commit

Delta semántico

Ninguna definición cambió: el cambio es de texto, documentación o datos.

1 archivos · +16 −0

diff --git a/scripts/farm/hammer-farm.service b/scripts/farm/hammer-farm.service
index edff3121..9ced5ce7 100644
--- a/scripts/farm/hammer-farm.service
+++ b/scripts/farm/hammer-farm.service
@@ -2,6 +2,19 @@
 Description=hammer build farm worker (loop autónomo)
 After=network-online.target
 Wants=network-online.target
+# ── FRENO AL CRASHLOOP (2026-08-31) ──────────────────────────────────────────────────────────────
+# Sin esto, `Restart=always` + una receta que no entra en RAM = bucle infinito. Medido en el LXC
+# dev.gioser.net: `clang18` disparó el OOM killer, systemd relanzó a los 30 s, el loop volvió a la
+# misma receta (build-farm recorre la cola por glob alfabético y clang18 sale primera), OOM otra vez.
+# **30 HORAS así**: la caja quedó con presión de I/O `full avg300=43` —todo bloqueado en disco casi
+# la mitad del tiempo— y sshd sin poder ni completar el banner, o sea imposible de diagnosticar
+# desde fuera. Dos `oom-kill` en el journal fue todo lo que quedó como rastro.
+#
+# 3 arranques en 1 h ⇒ systemd se rinde y deja la unidad en `failed`, VISIBLE en `systemctl status`.
+# Un worker parado y diagnosticable vale más que uno que se reinicia para siempre: el hub ya tolera
+# workers ausentes (cosecha-cron avisa "siembra falló" y sigue), así que rendirse no pierde nada.
+StartLimitIntervalSec=3600
+StartLimitBurst=3
 
 [Service]
 Type=simple
@@ -14,6 +27,9 @@ Environment=HAMMER_DIR=/opt/hammer
 ExecStart=/opt/hammer/scripts/farm/farm-worker-loop.sh
 Restart=always
 RestartSec=30
+# El OOM del worker NO se reintenta como si fuera un fallo transitorio: si la receta no entra en la
+# caja, no va a entrar en 30 segundos. `stop` deja la unidad detenida y contable por StartLimitBurst.
+OOMPolicy=stop
 # deja respirar al sistema en una caja chica
 Nice=10
 IOSchedulingClass=idle