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).
Delta semántico
Ninguna definición cambió: el cambio es de texto, documentación o datos.
2 archivos · +15 −4
diff --git a/scripts/farm/harvest-go.sh b/scripts/farm/harvest-go.sh
index 881ade73..041eca0a 100755
--- a/scripts/farm/harvest-go.sh
+++ b/scripts/farm/harvest-go.sh
@@ -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)"
diff --git a/tandas/staged-fallidos/dolt.toml b/tandas/staged-fallidos/dolt.toml
index b843cac2..0ce484af 100644
--- a/tandas/staged-fallidos/dolt.toml
+++ b/tandas/staged-fallidos/dolt.toml
@@ -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"]