queue-drain-guard:pick 自己 150s 收手,逾時當成讀不到(inkstone/ISEP#33)

09-13 本機實量 Gitea 同一分鐘 curl 60s 逾時、整趟 pick --all 約 15 分鐘;
hooks.json 給本閘 180s,被砍掉=非阻擋錯誤=放行收工。實跑真 Gitea:150s 逾時 → exit 2、log 寫入。
測試 26/26。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-13 12:41:43 +08:00
parent ec9f28d9e8
commit 26aee6dffb
2 changed files with 22 additions and 3 deletions
+18 -3
View File
@@ -85,12 +85,27 @@ case "$INFO" in
*) note "⚪ 略過" "$INFO"; exit 0 ;; *) note "⚪ 略過" "$INFO"; exit 0 ;;
esac esac
# ② 問佇列(同一支 pick、同一套規則) # ② 問佇列(同一支 pick、同一套規則)**有時限**
# 2026-09-13 本機實量:Gitea 同一分鐘 curl 60s 逾時、urllib 17s0.3s42s 握手逾時,
# 整趟 `pick --all` 跑了約 15 分鐘。hooks.json 給本閘 180s;閘被 Claude Code 砍掉=非阻擋錯誤=放行收工,
# 正好又回到「讀不到就停」。⇒ 自己在 150s 收手,逾時當成「讀不到」(擋,叫它重跑 pick)。
if [ -n "${ISEP_DRAIN_PICK_CMD:-}" ]; then if [ -n "${ISEP_DRAIN_PICK_CMD:-}" ]; then
OUT=$(sh -c "$ISEP_DRAIN_PICK_CMD" 2>/dev/null); RC=$? PICK_ARGV="sh -c \"\$ISEP_DRAIN_PICK_CMD\""
else else
OUT=$(python3 "$PLUGIN_ROOT/scripts/ticket" pick --json 2>/dev/null); RC=$? PICK_ARGV="python3 \"$PLUGIN_ROOT/scripts/ticket\" pick --json"
fi fi
OUT=$(PICK_ARGV="$PICK_ARGV" python3 -c '
import os, subprocess, sys
try:
lim = float(os.environ.get("ISEP_DRAIN_PICK_TIMEOUT", "150"))
except ValueError:
lim = 150.0
try:
p = subprocess.run(["sh", "-c", os.environ["PICK_ARGV"]], capture_output=True, text=True, timeout=lim)
sys.stdout.write(p.stdout); sys.exit(p.returncode)
except subprocess.TimeoutExpired:
sys.exit(124)
' 2>/dev/null); RC=$?
STATE="$STATE_DIR/.queue-drain-$SID.json" STATE="$STATE_DIR/.queue-drain-$SID.json"
VERDICT=$(OUT="$OUT" RC="$RC" STATE="$STATE" python3 -c ' VERDICT=$(OUT="$OUT" RC="$RC" STATE="$STATE" python3 -c '
+4
View File
@@ -90,6 +90,10 @@ run "讀不到第 2 次 → 擋" 2 s9 worker.jsonl
run "★ 讀不到第 3 次 → 放行並留痕" 0 s9 worker.jsonl run "★ 讀不到第 3 次 → 放行並留痕" 0 s9 worker.jsonl
check "log 有 unreachable" "grep -q 'unreachable' '$TMP/state-s9/queue-drain-guard.log'" check "log 有 unreachable" "grep -q 'unreachable' '$TMP/state-s9/queue-drain-guard.log'"
printf '0' > "$TMP/rc"; printf '%s' "$TICKET" > "$TMP/out"
ISEP_DRAIN_PICK_CMD="sleep 5; sh $TMP/pick.sh" ISEP_DRAIN_PICK_TIMEOUT=1 run "★ pick 超過時限(Gitea 慢)→ 當成讀不到而擋,不是被砍掉後放行" 2 s10 worker.jsonl
check "逾時那次訊息是「讀不到 ≠ 沒票」" "grep -q '讀不到' '$TMP/stderr'"
echo echo
echo "── ④ 真的 pick(不帶假指令)接得上 ──" echo "── ④ 真的 pick(不帶假指令)接得上 ──"
unset ISEP_DRAIN_PICK_CMD unset ISEP_DRAIN_PICK_CMD