Commit 4735e42
committed
fix(archiver): move L2 tips cache refresh out of write transactions
The ArchiverDataStoreUpdater used to call `l2TipsCache.refresh()` inside
the `db.transactionAsync()` callback for every writer path. Two issues:
1. Mid-tx visibility. `refresh()` reassigns its internal #tipsPromise
synchronously, which was observable to other callers before LMDB had
actually committed. A concurrent reader calling `getL2Tips()` after
the reassignment but before commit picks up a promise loaded against
the in-flight tx state, while a sibling read on
`#proposedCheckpoints` directly outside the tx still sees pre-commit
state — split-snapshot reads in the sequencer's `checkSync()`.
2. No rollback on tx abort. If the LMDB transaction threw or aborted,
the cache had already been replaced with a promise loaded against
in-flight writes that would never commit. Future readers would see a
cache reflecting rolled-back state.
Refresh now runs after the writer transaction has fully committed, so
it loads from the committed store and is never replaced when the writer
aborts.
This does not close the JS-side race window completely — there is still
a small "tips lag store" window between LMDB commit returning and
`refresh()` finishing its `loadFromStore`. The sequencer's `checkSync()`
consistency checks (sequencer-client/src/sequencer/sequencer.ts ~L700)
already handle that residual window by detecting the mismatch and
returning undefined; those checks are intentionally left in place.1 parent 354bf11 commit 4735e42
3 files changed
Lines changed: 40 additions & 11 deletions
File tree
- yarn-project/archiver/src
- modules
- store
Lines changed: 28 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
| 10 | + | |
10 | 11 | | |
| 12 | + | |
11 | 13 | | |
12 | 14 | | |
13 | 15 | | |
14 | 16 | | |
15 | 17 | | |
| 18 | + | |
16 | 19 | | |
17 | 20 | | |
18 | 21 | | |
| |||
215 | 218 | | |
216 | 219 | | |
217 | 220 | | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
218 | 246 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
74 | 74 | | |
75 | 75 | | |
76 | 76 | | |
77 | | - | |
78 | 77 | | |
79 | 78 | | |
| 79 | + | |
80 | 80 | | |
81 | 81 | | |
82 | 82 | | |
| |||
144 | 144 | | |
145 | 145 | | |
146 | 146 | | |
147 | | - | |
148 | 147 | | |
149 | 148 | | |
| 149 | + | |
150 | 150 | | |
151 | 151 | | |
152 | 152 | | |
153 | 153 | | |
154 | 154 | | |
155 | 155 | | |
156 | | - | |
157 | 156 | | |
158 | | - | |
| 157 | + | |
159 | 158 | | |
160 | 159 | | |
161 | 160 | | |
| |||
256 | 255 | | |
257 | 256 | | |
258 | 257 | | |
259 | | - | |
260 | 258 | | |
261 | 259 | | |
| 260 | + | |
262 | 261 | | |
263 | 262 | | |
264 | 263 | | |
| |||
289 | 288 | | |
290 | 289 | | |
291 | 290 | | |
292 | | - | |
| 291 | + | |
293 | 292 | | |
294 | 293 | | |
295 | 294 | | |
| |||
300 | 299 | | |
301 | 300 | | |
302 | 301 | | |
303 | | - | |
304 | 302 | | |
305 | 303 | | |
| 304 | + | |
| 305 | + | |
306 | 306 | | |
307 | 307 | | |
308 | 308 | | |
| |||
312 | 312 | | |
313 | 313 | | |
314 | 314 | | |
315 | | - | |
316 | 315 | | |
| 316 | + | |
317 | 317 | | |
318 | 318 | | |
319 | 319 | | |
| |||
323 | 323 | | |
324 | 324 | | |
325 | 325 | | |
326 | | - | |
327 | 326 | | |
| 327 | + | |
328 | 328 | | |
329 | 329 | | |
330 | 330 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
16 | | - | |
| 16 | + | |
| 17 | + | |
17 | 18 | | |
18 | 19 | | |
19 | 20 | | |
| |||
34 | 35 | | |
35 | 36 | | |
36 | 37 | | |
37 | | - | |
| 38 | + | |
38 | 39 | | |
39 | 40 | | |
40 | 41 | | |
| |||
0 commit comments