fixup: update external loop state before handling keyspaces

`ValuesReconstructState::consume_done_keys` may only be called once
after a layer visit. The code in the previous commit called it for
each keyspace, resulting in keys not being marked done in the split
keyspace by floor LSN scenario.
This commit is contained in:
Vlad Lazar
2024-09-19 10:44:20 +01:00
parent 3a218d7525
commit 84d1af736e

View File

@@ -3170,16 +3170,21 @@ impl Timeline {
return Err(GetVectoredError::Cancelled);
}
let (keys_done_last_step, keys_with_image_coverage) =
reconstruct_state.consume_done_keys();
// Update state that is external to the loop.
completed_keyspace.merge(&keys_done_last_step);
if let Some(keys_with_image_coverage) = keys_with_image_coverage.clone() {
image_covered_keyspace.add_range(keys_with_image_coverage);
}
for (cont_lsn, unmapped_keyspace) in unmapped_keyspaces.iter_mut() {
let (keys_done_last_step, keys_with_image_coverage) =
reconstruct_state.consume_done_keys();
// Remove any completed keys from the currently inspected keyspace.
unmapped_keyspace.remove_overlapping_with(&keys_done_last_step);
completed_keyspace.merge(&keys_done_last_step);
if let Some(keys_with_image_coverage) = keys_with_image_coverage {
unmapped_keyspace.remove_overlapping_with(&KeySpace::single(
keys_with_image_coverage.clone(),
));
image_covered_keyspace.add_range(keys_with_image_coverage);
if let Some(keys_with_image_coverage) = keys_with_image_coverage.clone() {
unmapped_keyspace
.remove_overlapping_with(&KeySpace::single(keys_with_image_coverage));
}
// Do not descent any further if the last layer we visited