do not clear dirty pages on cacheflush::start

This commit is contained in:
Pere Diaz Bou
2025-07-21 15:42:01 +02:00
parent d77c899fa6
commit 674d88e140

View File

@@ -905,7 +905,6 @@ impl Pager {
trace!(?state);
match state {
CacheFlushState::Start => {
self.dirty_pages.borrow_mut().clear();
let dirty_pages = self
.dirty_pages
.borrow()
@@ -945,7 +944,6 @@ impl Pager {
0,
self.flush_info.borrow().in_flight_writes.clone(),
)?;
page.clear_dirty();
self.flush_info.borrow_mut().state = CacheFlushState::WaitAppendFrame {
current_page_to_append_idx,
};
@@ -956,8 +954,25 @@ impl Pager {
} => {
let in_flight = self.flush_info.borrow().in_flight_writes.clone();
if *in_flight.borrow() == 0 {
if current_page_to_append_idx == self.flush_info.borrow().dirty_pages.len() - 1
{
// Clear dirty now
let page_id = self.flush_info.borrow().dirty_pages[current_page_to_append_idx];
let page = {
let mut cache = self.page_cache.write();
let page_key = PageCacheKey::new(page_id);
let page = cache.get(&page_key).expect("we somehow added a page to dirty list but we didn't mark it as dirty, causing cache to drop it.");
let page_type = page.get().contents.as_ref().unwrap().maybe_page_type();
trace!(
"commit_dirty_pages(page={}, page_type={:?}",
page_id,
page_type
);
page
};
page.clear_dirty();
// Continue with next page
let is_last_page = current_page_to_append_idx
== self.flush_info.borrow().dirty_pages.len() - 1;
if is_last_page {
self.dirty_pages.borrow_mut().clear();
self.flush_info.borrow_mut().state = CacheFlushState::Start;
Ok(IOResult::Done(()))
@@ -1041,7 +1056,6 @@ impl Pager {
db_size,
self.commit_info.borrow().in_flight_writes.clone(),
)?;
page.clear_dirty();
self.commit_info.borrow_mut().state = CommitState::WaitAppendFrame {
current_page_to_append_idx,
};
@@ -1051,9 +1065,32 @@ impl Pager {
} => {
let in_flight = self.commit_info.borrow().in_flight_writes.clone();
if *in_flight.borrow() == 0 {
if current_page_to_append_idx
== self.commit_info.borrow().dirty_pages.len() - 1
{
// First clear dirty
let page_id =
self.commit_info.borrow().dirty_pages[current_page_to_append_idx];
let page = {
let mut cache = self.page_cache.write();
let page_key = PageCacheKey::new(page_id);
let page = cache.get(&page_key).unwrap_or_else(|| {
panic!(
"we somehow added a page to dirty list but we didn't mark it as dirty, causing cache to drop it. page={page_id}"
)
});
let page_type = page.get().contents.as_ref().unwrap().maybe_page_type();
trace!(
"commit_dirty_pages(page={}, page_type={:?}",
page_id,
page_type
);
page
};
page.clear_dirty();
// Now advance to next page if there are more
let is_last_frame = current_page_to_append_idx
== self.commit_info.borrow().dirty_pages.len() - 1;
if is_last_frame {
// Let's clear the page cache now
{
let mut cache = self.page_cache.write();
cache.clear().unwrap();