From 674d88e1407a334c8169afb61abcf59d4d18ce6b Mon Sep 17 00:00:00 2001 From: Pere Diaz Bou Date: Mon, 21 Jul 2025 15:42:01 +0200 Subject: [PATCH] do not clear dirty pages on cacheflush::start --- core/storage/pager.rs | 53 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 8 deletions(-) diff --git a/core/storage/pager.rs b/core/storage/pager.rs index c33004b86..ca5392a58 100644 --- a/core/storage/pager.rs +++ b/core/storage/pager.rs @@ -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();