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)"