KB-42A9

S170 P1 Fix — Deadlock + move + delete sync

2 min read Revision 1
reportfixp1deadlockmovedelete-syncs1702026-04-06

S170 P1 Fix Report — Deadlock + move_document + Directus Delete Sync

Date: 2026-04-06 | Status: ✅ 3/3 FIXED + VERIFIED


Fix 1: PG Deadlock (P1)

Root cause: 2 crons at */10 * * * * both lock meta_catalog. Fix: Staggered orphan refresh to 5,15,25,35,45,55 * * * *. Verify: 0 deadlocks in 20 minutes after fix.

Fix 2: move_document (P1)

Root cause: handler only updates parent_id in JSONB data but does NOT rename PG key or Qdrant document_id. Returns 200 but document stays at old path. Fix: Deprecated endpoint. Returns 501 with message: "Use (1) upload to new path, (2) delete old path." Verify: POST /documents/.../move → 501 NOT_IMPLEMENTED

Fix 3: Directus Delete Sync (P1 — newly discovered)

Root cause: delete_document emits doc_id with __ encoding (from URL path), but _should_sync() in directus_sync.py checks doc_id.startswith("knowledge/") with slashes. The __ encoded ID never matches → delete event silently skipped. Fix: Added normalization in directus_sync_listener: if "__" in doc_id and "/" not in doc_id: doc_id = doc_id.replace("__", "/") Verify: Create doc → Directus count=1 → Delete → Directus count=0 ✅

Evidence

Test Before After Status
Deadlocks (20 min) 5/day 0
move_document 200 (fake success) 501 (documented)
Delete sync Directus record persists Directus record deleted

Files Changed

File Repo Change
server.py agent-data-repo move_document → 501
directus_sync.py agent-data-repo __ normalization
crontab VPS orphan cron staggered

Git: agent-data-repo 3fcad85


3 P1 bugs fixed | 0 deadlocks | delete sync working | move deprecated