tawasuyu

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 1101Rust 61Shell 47Markdown 371349 Definiciones

⎇ 4190c7b43e5bd323a9b166340cfa16cd324ca2e4 scripts/farm/takana-farm.service 46 líneas · 2.6 KB Historia crudo

takana: el worker pasa a /opt/takana y takana-farm.service aacee245d · Sergio ·

1[Unit]
2Description=takana build farm worker (loop autónomo)
3After=network-online.target
4Wants=network-online.target
5# ── FRENO AL CRASHLOOP (2026-08-31) ──────────────────────────────────────────────────────────────
6# Sin esto, `Restart=always` + una receta que no entra en RAM = bucle infinito. Medido en el LXC
7# dev.gioser.net: `clang18` disparó el OOM killer, systemd relanzó a los 30 s, el loop volvió a la
8# misma receta (build-farm recorre la cola por glob alfabético y clang18 sale primera), OOM otra vez.
9# **30 HORAS así**: la caja quedó con presión de I/O `full avg300=43` —todo bloqueado en disco casi
10# la mitad del tiempo— y sshd sin poder ni completar el banner, o sea imposible de diagnosticar
11# desde fuera. Dos `oom-kill` en el journal fue todo lo que quedó como rastro.
12#
13# 3 arranques en 1 h ⇒ systemd se rinde y deja la unidad en `failed`, VISIBLE en `systemctl status`.
14# Un worker parado y diagnosticable vale más que uno que se reinicia para siempre: el hub ya tolera
15# workers ausentes (cosecha-cron avisa "siembra falló" y sigue), así que rendirse no pierde nada.
16StartLimitIntervalSec=3600
17StartLimitBurst=3
18
19[Service]
20Type=simple
21WorkingDirectory=/opt/takana
22Environment=HOME=/root
23# ADR 0016: se fijan LAS DOS mientras dure el renombre. Los scripts leen
24# ${TAKANA_DIR:-${HAMMER_DIR:-…}}, pero un script VIEJO —o una copia del repo
25# que todavía no sincronizó— sólo mira HAMMER_DIR. Medido el 2026-09-09: esta
26# unit era el ÚNICO sitio fuera del repo que traía una variable vieja puesta, y
27# es lo que hoy impide retirar la caída. Cuando el worker corra con TAKANA_DIR
28# y el resto de la flota también, se borra la segunda línea y recién ahí se
29# puede retirar la caída del código (etapa 6).
30Environment=TAKANA_DIR=/opt/takana
31Environment=HAMMER_DIR=/opt/takana
32# JOBS no se fija: el loop usa nproc por defecto (cada build usa 1 core por codegen-units=1).
33# Así, al REPOTENCIAR la caja (CCX13→CCX23/33), el worker auto-escala los slots sin tocar config.
34# La línea CCX da ~4GB RAM/core ⇒ nproc slots quedan con margen para builds Rust + swap.
35ExecStart=/opt/takana/scripts/farm/farm-worker-loop.sh
36Restart=always
37RestartSec=30
38# El OOM del worker NO se reintenta como si fuera un fallo transitorio: si la receta no entra en la
39# caja, no va a entrar en 30 segundos. `stop` deja la unidad detenida y contable por StartLimitBurst.
40OOMPolicy=stop
41# deja respirar al sistema en una caja chica
42Nice=10
43IOSchedulingClass=idle
44
45[Install]
46WantedBy=multi-user.target