mirror of
https://github.com/aljazceru/turso.git
synced 2025-12-24 11:34:21 +01:00
balance_non_root validation logic should be done in the next state
This commit is contained in:
@@ -2573,18 +2573,15 @@ impl BTreeCursor {
|
||||
// start loading right page first
|
||||
let mut pgno: u32 = unsafe { right_pointer.cast::<u32>().read().swap_bytes() };
|
||||
let current_sibling = sibling_pointer;
|
||||
let mut completions = Vec::with_capacity(current_sibling + 1);
|
||||
for i in (0..=current_sibling).rev() {
|
||||
let (page, _c) = btree_read_page(&self.pager, pgno as usize)?;
|
||||
let (page, c) = btree_read_page(&self.pager, pgno as usize)?;
|
||||
{
|
||||
// mark as dirty
|
||||
let sibling_page = page.get();
|
||||
self.pager.add_dirty(&sibling_page);
|
||||
}
|
||||
#[cfg(debug_assertions)]
|
||||
{
|
||||
return_if_locked!(page.get());
|
||||
debug_validate_cells!(&page.get().get_contents(), usable_space as u16);
|
||||
}
|
||||
completions.push(c);
|
||||
pages_to_balance[i].replace(page);
|
||||
if i == 0 {
|
||||
break;
|
||||
@@ -2641,23 +2638,6 @@ impl BTreeCursor {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(debug_assertions)]
|
||||
{
|
||||
let page_type_of_siblings = pages_to_balance[0]
|
||||
.as_ref()
|
||||
.unwrap()
|
||||
.get()
|
||||
.get_contents()
|
||||
.page_type();
|
||||
for page in pages_to_balance.iter().take(sibling_count) {
|
||||
return_if_locked_maybe_load!(self.pager, page.as_ref().unwrap());
|
||||
let page = page.as_ref().unwrap().get();
|
||||
let contents = page.get_contents();
|
||||
debug_validate_cells!(&contents, usable_space as u16);
|
||||
assert_eq!(contents.page_type(), page_type_of_siblings);
|
||||
}
|
||||
}
|
||||
|
||||
balance_info.borrow_mut().replace(BalanceInfo {
|
||||
pages_to_balance,
|
||||
rightmost_pointer: right_pointer,
|
||||
@@ -2666,6 +2646,10 @@ impl BTreeCursor {
|
||||
first_divider_cell: first_cell_divider,
|
||||
});
|
||||
*sub_state = BalanceSubState::NonRootDoBalancing;
|
||||
if !completions.is_empty() {
|
||||
// TODO: when tracking IO return all the completions here
|
||||
return Ok(IOResult::IO);
|
||||
}
|
||||
}
|
||||
BalanceSubState::NonRootDoBalancing => {
|
||||
// Ensure all involved pages are in memory.
|
||||
@@ -2677,7 +2661,23 @@ impl BTreeCursor {
|
||||
.take(balance_info.sibling_count)
|
||||
{
|
||||
let page = page.as_ref().unwrap();
|
||||
return_if_locked_maybe_load!(self.pager, page);
|
||||
let page = page.get();
|
||||
return_if_locked!(page);
|
||||
|
||||
#[cfg(debug_assertions)]
|
||||
let page_type_of_siblings = balance_info.pages_to_balance[0]
|
||||
.as_ref()
|
||||
.unwrap()
|
||||
.get()
|
||||
.get_contents()
|
||||
.page_type();
|
||||
|
||||
#[cfg(debug_assertions)]
|
||||
{
|
||||
let contents = page.get_contents();
|
||||
debug_validate_cells!(&contents, usable_space as u16);
|
||||
assert_eq!(contents.page_type(), page_type_of_siblings);
|
||||
}
|
||||
}
|
||||
// Start balancing.
|
||||
let parent_page_btree = self.stack.top();
|
||||
|
||||
Reference in New Issue
Block a user