כשה-legal-halacha-drain קרס עם "RuntimeError: Event loop is closed", ה-finally שמריץ pg_advisory_unlock + pool.release לא רץ, וחיבור-הנעילה הייעודי נשאר חי, idle, מחזיק את הנעילה הגלובלית — כל extract עתידי החזיר status='busy' לצמיתות עד pg_terminate_backend ידני (~4.5 דק', CMP-174, 2026-06-14). תיקון (G1 — נרמול-במקור, G2 — אותה נעילה, בלי מסלול מקביל): - KEEPALIVE: משימת-רקע נוגעת בחיבור-הנעילה כל 30ש' → state_change נשאר טרי. חילוץ חי לעולם לא נראה "תקוע"; קריסה מקפיאה את ה-keepalive ואת state_change. - שחזור-עצמי בכניסה (_acquire_global_lock): כש-pg_try_advisory_lock נכשל, בודקים את ה-holder; רק backend idle עם state_change ישן מ-_LOCK_STALE_AFTER (150ש', 5× keepalive) הוא orphan דלוף → pg_terminate_backend ואז acquire מחדש. backend 'active' או idle-טרי = חילוץ חי, לעולם לא נהרג (מניעת ה-box-freeze). - נדחתה אופציית pg_advisory_xact_lock: הייתה כופה transaction פתוח לאורך דקות (idle-in-transaction bloat) ועדיין לא משחררת מיידית חיבור-orphan חי. הערה: השתמשתי במונח DB-סטנדרטי "keepalive" (לא "heartbeat") כי leak_guard מסמן את "heartbeat" כסמל ספציפי-Paperclip (G12). בדיקות: tests/test_halacha_lock_selfheal.py (7) — free/live-holder/active-holder/ stale-orphan-reclaim/no-holder/keepalive-stop/extract-busy. כל 332 בדיקות mcp עוברות. Invariants: G1 (תיקון-במקור), G2 (אותה נעילה), G3/X16 (עמידות-פייפליין), G12 (leak-guard נקי). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
5.3 KiB
5.3 KiB