Commit 8cf0dcb
authored
The memory_links → memory_units FKs are DEFERRABLE INITIALLY DEFERRED
(migration 9f8e7d6c5b4a), so an INSERT into memory_links takes no lock on
the referenced parent rows until COMMIT. Temporal and ANN link inserts
reference a *pre-existing* neighbor unit as to_unit_id (graph maintenance
also references a pre-existing from_unit_id). A concurrent transaction that
commits a DELETE of that unit in the window between the link INSERT and our
COMMIT — consolidation pruning observation units, document re-tracking —
makes the deferred check fail at COMMIT with
fk_memory_links_to_unit_id_memory_units, failing the async op with no retry.
#1795/#1805 only removed one *deleter* (sibling async children sharing a
document_id) for the from_unit_id side; the to_unit_id side, and any other
deleter, stayed uncovered.
Fix: in the PostgreSQL bulk link insert, lock the referenced parent units
FOR KEY SHARE via a CTE in the *same* INSERT statement. The lock blocks a
concurrent DELETE until our transaction commits and is held through the
deferred check; the INSERT only takes links whose endpoints are in the
locked set, so endpoints that already vanished are dropped. Folding it into
the one INSERT keeps this to a single round-trip — no extra query and no
surrounding transaction — so retain's perf characteristics are unchanged.
A WHERE EXISTS guard can't fix this (the row passes the check, then is
deleted before the deferred check runs). Oracle's FK is immediate (no such
window) and keeps its existing exists_clause path.
Adds a deterministic regression test that hand-drives the connection
interleaving (no sleeps): insert link on A (uncommitted) → delete neighbor
on B → commit A. Pre-fix this raises the FK violation; post-fix B blocks on
A's lock and the link commits cleanly.
1 parent 4280ac3 commit 8cf0dcb
2 files changed
Lines changed: 160 additions & 4 deletions
File tree
- hindsight-api-slim
- hindsight_api/engine/db
- tests
Lines changed: 34 additions & 4 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
200 | 200 | | |
201 | 201 | | |
202 | 202 | | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
203 | 220 | | |
204 | 221 | | |
205 | 222 | | |
| |||
208 | 225 | | |
209 | 226 | | |
210 | 227 | | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
211 | 234 | | |
212 | 235 | | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
213 | 242 | | |
214 | 243 | | |
215 | 244 | | |
216 | 245 | | |
217 | | - | |
218 | | - | |
| 246 | + | |
| 247 | + | |
219 | 248 | | |
220 | 249 | | |
221 | 250 | | |
222 | 251 | | |
223 | | - | |
224 | | - | |
| 252 | + | |
| 253 | + | |
225 | 254 | | |
226 | 255 | | |
227 | 256 | | |
228 | 257 | | |
| 258 | + | |
229 | 259 | | |
230 | 260 | | |
231 | 261 | | |
| |||
Lines changed: 126 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
0 commit comments