fix(halacha): נעילה גלובלית — חילוץ אחד בכל רגע (מונע הקפאת מכונה) #30

Merged
chaim merged 1 commits from fix/halacha-extract-global-lock into main 2026-05-31 20:43:10 +00:00
Owner

הבעיה (2026-05-31 — הקפאת מכונה + reboot קשה)

חילוץ הלכות עבר ל-opus-4-8 @ xhigh (PR #26 — כבד CPU/RAM). כש-CMPA-71 רץ, ה-fallback של הסוכן השיק מספר driver-תהליכים חופפים (כל retry = python -c נפרד; process_pending טורי בתוך תהליך אך המכונה הריצה 4-5 drivers במקביל) → 12-16 תהליכי claude -p xhigh בו-זמנית → load 69 → המכונה נתקעה, נדרש reboot קשה.

התיקון

halacha_extractor.extract() לוקח כעת PostgreSQL advisory lock (pg_try_advisory_lock, מפתח 'HALA') לפני כל עבודה. אם חילוץ אחר (כל תהליך/סוכן/driver — כולם חולקים את ה-DB) מחזיק את הנעילה → מחזיר status='busy' והתקדים נשאר pending ל-drain הבא. מבטיח חילוץ אחד בלבד בכל רגע — חוצה-תהליכים (semaphore בתוך-תהליך לא רואה drivers נפרדים).

  • הליבה עברה ל-_extract_impl (ללא שינוי) תחת הנעילה.
  • CHUNK_CONCURRENCY כעת מתכוונן ב-env (HALACHA_CHUNK_CONCURRENCY, ברירת-מחדל 3).

אימות

תחת נעילה מוחזקת, extract() החזיר busy בלי שום קריאת-LLM ובלי לגעת בנתונים; הנעילה משתחררת תקין והחילוץ הבא ממשיך. עוקב #72.

🤖 Generated with Claude Code

## הבעיה (2026-05-31 — הקפאת מכונה + reboot קשה) חילוץ הלכות עבר ל-**opus-4-8 @ xhigh** (PR #26 — כבד CPU/RAM). כש-CMPA-71 רץ, ה-fallback של הסוכן השיק **מספר driver-תהליכים חופפים** (כל retry = `python -c` נפרד; `process_pending` טורי *בתוך* תהליך אך המכונה הריצה 4-5 drivers במקביל) → **12-16 תהליכי `claude -p` xhigh בו-זמנית** → load 69 → המכונה נתקעה, נדרש reboot קשה. ## התיקון `halacha_extractor.extract()` לוקח כעת **PostgreSQL advisory lock** (`pg_try_advisory_lock`, מפתח `'HALA'`) לפני כל עבודה. אם חילוץ אחר (כל תהליך/סוכן/driver — כולם חולקים את ה-DB) מחזיק את הנעילה → מחזיר `status='busy'` והתקדים נשאר pending ל-drain הבא. **מבטיח חילוץ אחד בלבד בכל רגע — חוצה-תהליכים** (semaphore בתוך-תהליך לא רואה drivers נפרדים). - הליבה עברה ל-`_extract_impl` (ללא שינוי) תחת הנעילה. - `CHUNK_CONCURRENCY` כעת מתכוונן ב-env (`HALACHA_CHUNK_CONCURRENCY`, ברירת-מחדל 3). ## אימות תחת נעילה מוחזקת, `extract()` החזיר `busy` **בלי שום קריאת-LLM** ובלי לגעת בנתונים; הנעילה משתחררת תקין והחילוץ הבא ממשיך. עוקב #72. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-05-31 20:43:03 +00:00
2026-05-31: opus-4-8 @ xhigh extraction + overlapping driver processes (agent
fallback retries each spawn an independent `python -c` driver; process_pending is
serial WITHIN a process but the box ran 4-5 drivers in parallel) → 12-16 concurrent
xhigh `claude -p` procs → load 69 → hard reboot.

Fix: halacha_extractor.extract() now takes a Postgres advisory lock
(pg_try_advisory_lock, key 'HALA') before any work. If another extraction (any
process/agent/driver — all share the legal-ai DB) holds it, the call returns
status='busy' and the precedent stays pending for the next drain. Guarantees ONE
extraction at a time ACROSS PROCESSES — an in-process Semaphore cannot (drivers
are separate OS processes). Core logic moved to _extract_impl (unchanged) under
the lock. CHUNK_CONCURRENCY now env-tunable (HALACHA_CHUNK_CONCURRENCY, default 3).

Verified: while a lock is held, extract() returns 'busy' with no LLM call; lock
releases cleanly and the next extraction proceeds. Tracks #72.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chaim merged commit 6183e24316 into main 2026-05-31 20:43:10 +00:00
chaim deleted branch fix/halacha-extract-global-lock 2026-05-31 20:43:10 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ezer-mishpati/legal-ai#30