mirror of
https://github.com/aljazceru/turso.git
synced 2026-02-23 17:05:36 +01:00
do not clear dirty pages on cacheflush::start
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user