reinitialize WalFileShare when reset page size

This commit is contained in:
meteorgan
2025-07-14 21:05:43 +08:00
parent b42a1ef272
commit d7bdfeb711
4 changed files with 21 additions and 12 deletions

View File

@@ -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);

View File

@@ -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<u32> {
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<CursorResult<u32>> {
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),
}
}

View File

@@ -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;
}
}

View File

@@ -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