Etapa G: harvest lock STALE-AWARE (PID; roba si el dueño murió) — un lock huérfano bloqueó el cron 16h

+ dolt: corregido, necesita ICU4C (go-icu-regex), no oniguruma. oniguruma queda en el corpus (útil p/ otros regex).
This commit is contained in:
2026-06-29 22:52:24 -04:00
parent 15690d72c6
commit 199ce9b9dd
2 changed files with 15 additions and 4 deletions
+12 -3
View File
@@ -39,13 +39,22 @@ SSH="ssh -i $SSH_KEY -o StrictHostKeyChecking=accept-new -o ConnectTimeout=20"
export GIT_SSH_COMMAND="ssh -i $SSH_KEY -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new"
STAMP() { date -u +%FT%TZ; }
# Lock: una sola cosecha a la vez (el cron no se solapa).
# Lock: una sola cosecha a la vez (el cron no se solapa). STALE-AWARE: si el proceso dueño murió sin
# correr su trap (matado / teardown), el lock quedaría huérfano y BLOQUEARÍA todo cron futuro (pasó:
# un harvest viejo murió con el lock tomado → 16h de cron no-op). Por eso guardamos el PID y, si el
# dueño ya no vive, robamos el lock.
LOCK="$ROOT/work/.harvest-go.lock"
mkdir -p "$ROOT/work"
if ! mkdir "$LOCK" 2>/dev/null; then
echo "$(STAMP) harvest-go: ya hay una cosecha en curso ($LOCK) ⇒ salgo"; exit 0
oldpid=$(cat "$LOCK/pid" 2>/dev/null)
if [ -n "$oldpid" ] && kill -0 "$oldpid" 2>/dev/null; then
echo "$(STAMP) harvest-go: ya hay una cosecha en curso (pid $oldpid) ⇒ salgo"; exit 0
fi
echo "$(STAMP) harvest-go: lock huérfano (pid ${oldpid:-?} muerto) ⇒ lo robo"
rm -rf "$LOCK"; mkdir "$LOCK" 2>/dev/null || { echo "$(STAMP) no pude tomar el lock"; exit 0; }
fi
trap 'rmdir "$LOCK" 2>/dev/null' EXIT INT TERM
echo "$$" > "$LOCK/pid"
trap 'rm -rf "$LOCK" 2>/dev/null' EXIT INT TERM
echo "=================================================================="
echo "$(STAMP) harvest-go: arranco (VPS=$VPS)"
+3 -1
View File
@@ -1,3 +1,4 @@
# DIFERIDA (frontera): subdir=go + cgo OK (llega al compile cgo), pero go-icu-regex necesita ICU4C (unicode/uregex.h), lib C++ GRANDE — NO oniguruma. Falta receta icu4c.
# Importada de nixpkgs por `hammer import-nix` (Etapa G). PUNTO DE PARTIDA, no final:
# - el build usa el lab de hammer (zig-cc / musl estático), NO el stdenv de nix ⇒ revisá
# compiler/link/phases y adaptá hasta que compile.
@@ -14,8 +15,9 @@ compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "static"
subdir = "go"
cgo = true # go-mysql-server internal/regex usa cgo+oniguruma
flags = []
# buildInputs de nix (no usados con CGO off): go, icu4c
[deps]
build = ["go"]
build = ["go", "oniguruma", "pkgconf"]