fix(halacha): שחזור-עצמי לנעילת-advisory דלופה — לא לחסום חילוץ-הלכות (#142) #258
Reference in New Issue
Block a user
Delete Branch "worktree-halacha-lock-leak"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
הבעיה (#142)
כשה-
legal-halacha-drainקרס עםRuntimeError: Event loop is closed, ה-finallyב-halacha_extractor.extract()שמריץpg_advisory_unlock+pool.releaseלא רץ. חיבור-הנעילה הייעודי (lock_conn) נשאר חי, idle, ומחזיק את הנעילה הגלובלית — וכך כלprecedent_extract_halachotעתידי החזירstatus='busy'לצמיתות, עדpg_terminate_backendידני (~4.5 דק', CMP-174, 2026-06-14, objid 1212238913).התיקון
נעילת-session נשמרת, אך הופכת משחזרת-עצמית:
lock_connכל 30ש' (SELECT 1), כך ש-pg_stat_activity.state_changeנשאר טרי. חילוץ חי לעולם לא נראה תקוע; קריסה מקפיאה את ה-keepalive (ואתstate_change) יחד עם ה-loop._acquire_global_lock) — כש-pg_try_advisory_lockנכשל, בודקים את ה-holder ב-pg_locks⋈pg_stat_activity. רק backendidleעםstate_changeישן מ-_LOCK_STALE_AFTER(150ש' = 5× keepalive) מזוהה כ-orphan דלוף →pg_terminate_backendואזpg_try_advisory_lockמחדש (עד 10 פולים). backendactiveאוidle-טרי = חילוץ חי → לעולם לא נהרג (כדי לא להחזיר את ה-box-freeze שהנעילה מונעת).נדחתה אופציה (ג)
pg_advisory_xact_lock: הייתה כופה transaction פתוח לאורך דקות (idle-in-transaction bloat) ועדיין לא משחררת מיידית חיבור-orphan חי.בדיקות
tests/test_halacha_lock_selfheal.py— 7 בדיקות offline: lock-free, live-holder (לא נהרג), active-holder (לא נהרג), stale-orphan (terminate+reclaim), no-holder-row, keepalive-stop,extractמחזירbusy.leak_guardנקי.Invariants
🤖 Generated with Claude Code