From b6468f11e72dccb5f8f8893fcb1f16014d8d0a3f Mon Sep 17 00:00:00 2001 From: Pere Diaz Bou Date: Fri, 26 Jul 2024 14:33:58 +0200 Subject: [PATCH] core: clear dirty on finish write Signed-off-by: Pere Diaz Bou --- core/pager.rs | 7 +++++-- core/sqlite3_ondisk.rs | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/core/pager.rs b/core/pager.rs index 316dbe292..a2ec517f5 100644 --- a/core/pager.rs +++ b/core/pager.rs @@ -24,7 +24,7 @@ const PAGE_UPTODATE: usize = 0b001; const PAGE_LOCKED: usize = 0b010; /// Page had an I/O error. const PAGE_ERROR: usize = 0b100; -/// Page had an I/O error. +/// Page is dirty. Flush needed. const PAGE_DIRTY: usize = 0b1000; impl Default for Page { @@ -333,14 +333,17 @@ impl Pager { pub fn cacheflush(&self) -> Result<()> { let mut dirty_pages = RefCell::borrow_mut(&self.dirty_pages); + if dirty_pages.len() == 0 { + return Ok(()); + } loop { if dirty_pages.len() == 0 { break; } let page = dirty_pages.pop().unwrap(); sqlite3_ondisk::begin_write_btree_page(self, &page)?; - self.io.run_once()?; } + self.io.run_once()?; Ok(()) } } diff --git a/core/sqlite3_ondisk.rs b/core/sqlite3_ondisk.rs index ad9a37b55..d2ff1cac4 100644 --- a/core/sqlite3_ondisk.rs +++ b/core/sqlite3_ondisk.rs @@ -318,6 +318,7 @@ fn finish_read_btree_page( pub fn begin_write_btree_page(pager: &Pager, page: &Rc>) -> Result<()> { let page_source = &pager.page_source; + let page_finish = page.clone(); let page = page.borrow(); let contents = page.contents.read().unwrap(); let contents = contents.as_ref().unwrap(); @@ -327,6 +328,7 @@ pub fn begin_write_btree_page(pager: &Pager, page: &Rc>) -> Result Box::new(move |bytes_written: i32| { let buf_copy = buf_copy.clone(); let buf_len = buf_copy.borrow().len(); + page_finish.borrow_mut().clear_dirty(); if bytes_written < buf_len as i32 { log::error!("wrote({bytes_written}) less than expected({buf_len})"); }