From d7bdfeb711f702bc5f5183c848a12c01764db54f Mon Sep 17 00:00:00 2001 From: meteorgan Date: Mon, 14 Jul 2025 21:05:43 +0800 Subject: [PATCH] reinitialize WalFileShare when reset page size --- core/lib.rs | 6 ++---- core/storage/header_accessor.rs | 19 ++++++++++++++++--- core/storage/wal.rs | 4 ---- testing/pragma.test | 4 +++- 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/core/lib.rs b/core/lib.rs index 0e763a67a..3d169121a 100644 --- a/core/lib.rs +++ b/core/lib.rs @@ -274,10 +274,7 @@ impl Database { if let Some(shared_wal) = self.maybe_shared_wal.read().clone() { let size = match page_size { None => unsafe { (*shared_wal.get()).page_size() as usize }, - Some(size) => { - unsafe { (*shared_wal.get()).set_page_size(size as u32) }; - size - } + Some(size) => size, }; let buffer_pool = Arc::new(BufferPool::new(Some(size))); @@ -847,6 +844,7 @@ impl Connection { return Ok(()); } + *self._db.maybe_shared_wal.write() = None; let pager = self._db.init_pager(Some(size as usize))?; self.pager.replace(Rc::new(pager)); self.pager.borrow().set_initial_page_size(size); diff --git a/core/storage/header_accessor.rs b/core/storage/header_accessor.rs index 766a122b0..a2aba8013 100644 --- a/core/storage/header_accessor.rs +++ b/core/storage/header_accessor.rs @@ -159,7 +159,7 @@ macro_rules! impl_header_field_accessor { } // impl_header_field_accessor!(magic, [u8; 16], HEADER_OFFSET_MAGIC); -impl_header_field_accessor!(page_size_, u16, HEADER_OFFSET_PAGE_SIZE); +impl_header_field_accessor!(page_size_u16, u16, HEADER_OFFSET_PAGE_SIZE); impl_header_field_accessor!(write_version, u8, HEADER_OFFSET_WRITE_VERSION); impl_header_field_accessor!(read_version, u8, HEADER_OFFSET_READ_VERSION); impl_header_field_accessor!(reserved_space, u8, HEADER_OFFSET_RESERVED_SPACE); @@ -196,7 +196,7 @@ impl_header_field_accessor!(version_valid_for, u32, HEADER_OFFSET_VERSION_VALID_ impl_header_field_accessor!(version_number, u32, HEADER_OFFSET_VERSION_NUMBER); pub fn get_page_size(pager: &Pager) -> Result { - let size = get_page_size_(pager)?; + let size = get_page_size_u16(pager)?; if size == 1 { return Ok(MAX_PAGE_SIZE); } @@ -210,5 +210,18 @@ pub fn set_page_size(pager: &Pager, value: u32) -> Result<()> { } else { value as u16 }; - set_page_size_(pager, page_size) + set_page_size_u16(pager, page_size) +} + +#[allow(dead_code)] +pub fn get_page_size_async(pager: &Pager) -> Result> { + match get_page_size_u16_async(pager)? { + CursorResult::Ok(size) => { + if size == 1 { + return Ok(CursorResult::Ok(MAX_PAGE_SIZE)); + } + Ok(CursorResult::Ok(size as u32)) + } + CursorResult::IO => Ok(CursorResult::IO), + } } diff --git a/core/storage/wal.rs b/core/storage/wal.rs index 884df632b..45114fed4 100644 --- a/core/storage/wal.rs +++ b/core/storage/wal.rs @@ -1123,8 +1123,4 @@ impl WalFileShared { pub fn page_size(&self) -> u32 { self.wal_header.lock().page_size } - - pub fn set_page_size(&self, page_size: u32) { - self.wal_header.lock().page_size = page_size; - } } diff --git a/testing/pragma.test b/testing/pragma.test index 98c34265f..879c0516e 100755 --- a/testing/pragma.test +++ b/testing/pragma.test @@ -189,8 +189,10 @@ do_execsql_test_on_specific_db ":memory:" pragma-page-size-set-initialized-db { # pragma page_size=xxx changes the page size of an uninitialized database and persists the change. set test_pragma_page_size_db "testing/testing_pragma_page_size.db" +catch {file delete -force $test_pragma_page_size_db} +catch {file delete -force "${test_pragma_page_size_db}-wal"} # set user_version to trigger database initialization. -do_execsql_test_on_specific_db $test_pragma_page_size_db pragma-page-size-set-initialized-db-1 { +do_execsql_test_on_specific_db $test_pragma_page_size_db pragma-page-size-set-uninitialized-db-1 { PRAGMA page_size=1024; PRAGMA user_version=1; PRAGMA page_size