Commit 76009fc
committed
lsm: fix snapshot::get() skipping tombstones in SST files
A run (buildkite/82930, h/t Willem) of DebugRowsTest
test_read_and_write_rows caught a metastore validation failure where
partition metadata appeared to still exist after all rows had been
deleted. The partition_validator found stale metadata (via a get())
while correctly seeing that extents and terms were deleted (via iterator
scans).
In this particular test, a metastore flush happened to happen in between
deleting our rows and the post-test validation running, which unearthed
a bug in the LSM.
The SST point lookup path (snapshot::get -> impl::get -> version::get
-> sst::reader::internal_get) constructs an internal seek key with
the snapshot's seqno and value_type::value (=0). However, our LSM
encodes tombstone=1 and value=0. Internal keys sort by (seqno, type)
descending, so a tombstone (type=1) sorts before a value (type=0) at the
same seqno. The seek for the first entry >= the lookup key therefore
skips the tombstone and lands on the stale value from a prior seqno.
Iterator-based reads are unaffected because the db_iterator resolves
tombstones during iteration by deduplicating entries per user key.
The memtable's get() is also unaffected because it strips the type
before doing a lower_bound lookup.
This commit fixes snapshot::get() and database::get() to use
value_type::tombstone for the seek key, to use the highest type value,
so the seek key is the earliest possible internal key for a given
(user_key, seqno) pair. Also removes the now-stale dassert in
memtable::get() that rejected non-value lookup key types.1 parent 36e7d11 commit 76009fc
4 files changed
Lines changed: 102 additions & 9 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
186 | 186 | | |
187 | 187 | | |
188 | 188 | | |
189 | | - | |
190 | | - | |
191 | | - | |
192 | | - | |
193 | 189 | | |
194 | 190 | | |
195 | 191 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
168 | 168 | | |
169 | 169 | | |
170 | 170 | | |
| 171 | + | |
171 | 172 | | |
172 | 173 | | |
173 | 174 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
| 15 | + | |
15 | 16 | | |
16 | 17 | | |
17 | 18 | | |
| |||
154 | 155 | | |
155 | 156 | | |
156 | 157 | | |
| 158 | + | |
157 | 159 | | |
158 | 160 | | |
159 | 161 | | |
| |||
179 | 181 | | |
180 | 182 | | |
181 | 183 | | |
| 184 | + | |
182 | 185 | | |
183 | 186 | | |
184 | 187 | | |
| |||
210 | 213 | | |
211 | 214 | | |
212 | 215 | | |
| 216 | + | |
213 | 217 | | |
214 | 218 | | |
215 | 219 | | |
| |||
232 | 236 | | |
233 | 237 | | |
234 | 238 | | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
235 | 242 | | |
236 | 243 | | |
237 | | - | |
238 | 244 | | |
239 | 245 | | |
240 | | - | |
| 246 | + | |
241 | 247 | | |
242 | 248 | | |
243 | 249 | | |
| |||
258 | 264 | | |
259 | 265 | | |
260 | 266 | | |
261 | | - | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
262 | 287 | | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
263 | 305 | | |
264 | 306 | | |
265 | 307 | | |
| |||
313 | 355 | | |
314 | 356 | | |
315 | 357 | | |
| 358 | + | |
316 | 359 | | |
317 | 360 | | |
318 | 361 | | |
| |||
385 | 428 | | |
386 | 429 | | |
387 | 430 | | |
| 431 | + | |
| 432 | + | |
| 433 | + | |
| 434 | + | |
| 435 | + | |
| 436 | + | |
388 | 437 | | |
389 | 438 | | |
390 | 439 | | |
| |||
593 | 642 | | |
594 | 643 | | |
595 | 644 | | |
| 645 | + | |
| 646 | + | |
| 647 | + | |
| 648 | + | |
| 649 | + | |
| 650 | + | |
| 651 | + | |
| 652 | + | |
| 653 | + | |
| 654 | + | |
| 655 | + | |
| 656 | + | |
| 657 | + | |
| 658 | + | |
| 659 | + | |
| 660 | + | |
| 661 | + | |
| 662 | + | |
| 663 | + | |
| 664 | + | |
| 665 | + | |
| 666 | + | |
| 667 | + | |
| 668 | + | |
| 669 | + | |
| 670 | + | |
| 671 | + | |
| 672 | + | |
| 673 | + | |
| 674 | + | |
| 675 | + | |
| 676 | + | |
| 677 | + | |
| 678 | + | |
| 679 | + | |
| 680 | + | |
| 681 | + | |
| 682 | + | |
| 683 | + | |
| 684 | + | |
| 685 | + | |
| 686 | + | |
| 687 | + | |
| 688 | + | |
| 689 | + | |
| 690 | + | |
| 691 | + | |
596 | 692 | | |
597 | 693 | | |
598 | 694 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
194 | 194 | | |
195 | 195 | | |
196 | 196 | | |
197 | | - | |
| 197 | + | |
198 | 198 | | |
199 | 199 | | |
200 | 200 | | |
| |||
277 | 277 | | |
278 | 278 | | |
279 | 279 | | |
280 | | - | |
| 280 | + | |
281 | 281 | | |
282 | 282 | | |
283 | 283 | | |
| |||
0 commit comments