Commit 0f67ecd
fix(sync): re-read file at batch reconcile to avoid reverting newer accepted content
Batch note_content reconciliation reconciled each entity using
`indexed.markdown_content`, a scan-time snapshot. Between scan and reconcile a
note materialization can rewrite the file to a newer accepted db_version; the
batch then promoted the stale snapshot and reverted the newer write. The
db_version compare-and-set guard does not help: the stale snapshot promotes
cleanly to a fresh version.
Add an optional `file_reader` (NoteContentReconcileFileReader) threaded through
`reconcile_indexed_note_content_batch`, `IndexedNoteContentReconciliationTask`,
`IndexBatchRuntime`, and `build_default_index_batch_runtime`. When set, the
reconcile task re-reads the current file: missing content (file gone) skips
reconciliation, otherwise the fresh content and its mtime drive reconciliation
instead of the scan snapshot. Default None preserves existing behavior so cloud
compiles unchanged.
Local indexing wires a filesystem-backed reader
(FileServiceNoteContentReconcileFileReader) built on FileService. Cloud passes
None for now to avoid doubling S3 reads and can opt in later via its S3 reader.
Adds regression coverage: a stale scan snapshot no longer reverts a newer
accepted note_content version once the reader re-reads the current file, plus a
companion test documenting the revert that occurs without the reader.
🐛 Fixes a concurrency defect the version guard cannot catch.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: phernandez <paul@basicmachines.co>1 parent 5cd42a9 commit 0f67ecd
5 files changed
Lines changed: 359 additions & 6 deletions
File tree
- src/basic_memory
- indexing
- index
- tests
- indexing
- index
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| 7 | + | |
7 | 8 | | |
8 | 9 | | |
9 | 10 | | |
| |||
68 | 69 | | |
69 | 70 | | |
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 | + | |
71 | 108 | | |
72 | 109 | | |
73 | 110 | | |
| |||
598 | 635 | | |
599 | 636 | | |
600 | 637 | | |
| 638 | + | |
601 | 639 | | |
602 | 640 | | |
603 | 641 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
31 | 31 | | |
32 | 32 | | |
33 | 33 | | |
34 | | - | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
35 | 38 | | |
36 | 39 | | |
37 | 40 | | |
| |||
62 | 65 | | |
63 | 66 | | |
64 | 67 | | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
65 | 74 | | |
66 | 75 | | |
67 | 76 | | |
| |||
90 | 99 | | |
91 | 100 | | |
92 | 101 | | |
| 102 | + | |
93 | 103 | | |
94 | 104 | | |
95 | 105 | | |
| |||
136 | 146 | | |
137 | 147 | | |
138 | 148 | | |
| 149 | + | |
139 | 150 | | |
140 | 151 | | |
141 | 152 | | |
| |||
170 | 181 | | |
171 | 182 | | |
172 | 183 | | |
| 184 | + | |
173 | 185 | | |
174 | 186 | | |
175 | 187 | | |
Lines changed: 30 additions & 5 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
| 18 | + | |
18 | 19 | | |
19 | 20 | | |
20 | 21 | | |
| |||
175 | 176 | | |
176 | 177 | | |
177 | 178 | | |
| 179 | + | |
178 | 180 | | |
179 | 181 | | |
180 | 182 | | |
| |||
187 | 189 | | |
188 | 190 | | |
189 | 191 | | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
190 | 216 | | |
191 | 217 | | |
192 | 218 | | |
193 | | - | |
194 | | - | |
195 | | - | |
196 | | - | |
197 | | - | |
| 219 | + | |
| 220 | + | |
198 | 221 | | |
199 | 222 | | |
200 | 223 | | |
| |||
218 | 241 | | |
219 | 242 | | |
220 | 243 | | |
| 244 | + | |
221 | 245 | | |
222 | 246 | | |
223 | 247 | | |
| |||
242 | 266 | | |
243 | 267 | | |
244 | 268 | | |
| 269 | + | |
245 | 270 | | |
246 | 271 | | |
247 | 272 | | |
| |||
| 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 | + | |
0 commit comments