From 598fdade3e18b2e6bf1a108a2044f173f62a6722 Mon Sep 17 00:00:00 2001 From: Pekka Enberg Date: Sat, 2 Aug 2025 09:49:00 +0300 Subject: [PATCH] core: Fold HeaderRef to pager module --- core/storage/header_accessor.rs | 75 --------------------------------- core/storage/mod.rs | 1 - core/storage/pager.rs | 69 +++++++++++++++++++++++++++++- 3 files changed, 68 insertions(+), 77 deletions(-) delete mode 100644 core/storage/header_accessor.rs diff --git a/core/storage/header_accessor.rs b/core/storage/header_accessor.rs deleted file mode 100644 index 2fc2e7778..000000000 --- a/core/storage/header_accessor.rs +++ /dev/null @@ -1,75 +0,0 @@ -use super::sqlite3_ondisk::{DatabaseHeader, PageContent}; -use crate::turso_assert; -use crate::{ - storage::pager::{PageRef, Pager}, - types::IOResult, - LimboError, Result, -}; -use std::cell::{Ref, RefMut}; - -pub struct HeaderRef(PageRef); - -impl HeaderRef { - pub fn from_pager(pager: &Pager) -> Result> { - if !pager.db_state.is_initialized() { - return Err(LimboError::InternalError( - "Database is empty, header does not exist - page 1 should've been allocated before this".to_string() - )); - } - - let (page, _c) = pager.read_page(DatabaseHeader::PAGE_ID)?; - if page.is_locked() { - return Ok(IOResult::IO); - } - - turso_assert!( - page.get().id == DatabaseHeader::PAGE_ID, - "incorrect header page id" - ); - - Ok(IOResult::Done(Self(page))) - } - - pub fn borrow(&self) -> Ref<'_, DatabaseHeader> { - // TODO: Instead of erasing mutability, implement `get_mut_contents` and return a shared reference. - let content: &PageContent = self.0.get_contents(); - Ref::map(content.buffer.borrow(), |buffer| { - bytemuck::from_bytes::(&buffer.as_slice()[0..DatabaseHeader::SIZE]) - }) - } -} - -pub struct HeaderRefMut(PageRef); - -impl HeaderRefMut { - pub fn from_pager(pager: &Pager) -> Result> { - if !pager.db_state.is_initialized() { - return Err(LimboError::InternalError( - "Database is empty, header does not exist - page 1 should've been allocated before this".to_string(), - )); - } - - let (page, _c) = pager.read_page(DatabaseHeader::PAGE_ID)?; - if page.is_locked() { - return Ok(IOResult::IO); - } - - turso_assert!( - page.get().id == DatabaseHeader::PAGE_ID, - "incorrect header page id" - ); - - pager.add_dirty(&page); - - Ok(IOResult::Done(Self(page))) - } - - pub fn borrow_mut(&self) -> RefMut<'_, DatabaseHeader> { - let content = self.0.get_contents(); - RefMut::map(content.buffer.borrow_mut(), |buffer| { - bytemuck::from_bytes_mut::( - &mut buffer.as_mut_slice()[0..DatabaseHeader::SIZE], - ) - }) - } -} diff --git a/core/storage/mod.rs b/core/storage/mod.rs index c62a2a9df..c5dbdd1df 100644 --- a/core/storage/mod.rs +++ b/core/storage/mod.rs @@ -13,7 +13,6 @@ pub(crate) mod btree; pub(crate) mod buffer_pool; pub(crate) mod database; -pub(crate) mod header_accessor; pub(crate) mod page_cache; #[allow(clippy::arc_with_non_send_sync)] pub(crate) mod pager; diff --git a/core/storage/pager.rs b/core/storage/pager.rs index 15c7ff733..f6d61f57b 100644 --- a/core/storage/pager.rs +++ b/core/storage/pager.rs @@ -12,6 +12,7 @@ use crate::{return_if_io, Completion, TransactionState}; use crate::{turso_assert, Buffer, Connection, LimboError, Result}; use parking_lot::RwLock; use std::cell::{Cell, OnceCell, RefCell, UnsafeCell}; +use std::cell::{Ref, RefMut}; use std::collections::HashSet; use std::hash; use std::rc::Rc; @@ -20,7 +21,6 @@ use std::sync::{Arc, Mutex}; use tracing::{instrument, trace, Level}; use super::btree::{btree_init_page, BTreePage}; -use super::header_accessor::{HeaderRef, HeaderRefMut}; use super::page_cache::{CacheError, CacheResizeResult, DumbLruPageCache, PageCacheKey}; use super::sqlite3_ondisk::begin_write_btree_page; use super::wal::CheckpointMode; @@ -28,6 +28,73 @@ use super::wal::CheckpointMode; #[cfg(not(feature = "omit_autovacuum"))] use {crate::io::Buffer as IoBuffer, ptrmap::*}; +struct HeaderRef(PageRef); + +impl HeaderRef { + pub fn from_pager(pager: &Pager) -> Result> { + if !pager.db_state.is_initialized() { + return Err(LimboError::InternalError( + "Database is empty, header does not exist - page 1 should've been allocated before this".to_string() + )); + } + + let (page, _c) = pager.read_page(DatabaseHeader::PAGE_ID)?; + if page.is_locked() { + return Ok(IOResult::IO); + } + + turso_assert!( + page.get().id == DatabaseHeader::PAGE_ID, + "incorrect header page id" + ); + + Ok(IOResult::Done(Self(page))) + } + + pub fn borrow(&self) -> Ref<'_, DatabaseHeader> { + // TODO: Instead of erasing mutability, implement `get_mut_contents` and return a shared reference. + let content: &PageContent = self.0.get_contents(); + Ref::map(content.buffer.borrow(), |buffer| { + bytemuck::from_bytes::(&buffer.as_slice()[0..DatabaseHeader::SIZE]) + }) + } +} + +pub struct HeaderRefMut(PageRef); + +impl HeaderRefMut { + pub fn from_pager(pager: &Pager) -> Result> { + if !pager.db_state.is_initialized() { + return Err(LimboError::InternalError( + "Database is empty, header does not exist - page 1 should've been allocated before this".to_string(), + )); + } + + let (page, _c) = pager.read_page(DatabaseHeader::PAGE_ID)?; + if page.is_locked() { + return Ok(IOResult::IO); + } + + turso_assert!( + page.get().id == DatabaseHeader::PAGE_ID, + "incorrect header page id" + ); + + pager.add_dirty(&page); + + Ok(IOResult::Done(Self(page))) + } + + pub fn borrow_mut(&self) -> RefMut<'_, DatabaseHeader> { + let content = self.0.get_contents(); + RefMut::map(content.buffer.borrow_mut(), |buffer| { + bytemuck::from_bytes_mut::( + &mut buffer.as_mut_slice()[0..DatabaseHeader::SIZE], + ) + }) + } +} + pub struct PageInner { pub flags: AtomicUsize, pub contents: Option,