mirror of
https://github.com/aljazceru/turso.git
synced 2026-02-23 00:45:37 +01:00
Cache reserved_space and page_size values at Pager init.
We use `OnceLock` for this. TODO: Invalidate reserved_space when we make functionality the to change it.
This commit is contained in:
@@ -13,7 +13,7 @@ use std::cell::{RefCell, UnsafeCell};
|
||||
use std::collections::HashSet;
|
||||
use std::rc::Rc;
|
||||
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||
use std::sync::{Arc, Mutex};
|
||||
use std::sync::{Arc, Mutex, OnceLock};
|
||||
use tracing::{trace, Level};
|
||||
|
||||
use super::btree::{btree_init_page, BTreePage};
|
||||
@@ -222,6 +222,11 @@ pub struct Pager {
|
||||
/// Mutex for synchronizing database initialization to prevent race conditions
|
||||
init_lock: Arc<Mutex<()>>,
|
||||
allocate_page1_state: RefCell<AllocatePage1State>,
|
||||
/// Cache page_size and reserved_space at Pager init and reuse for subsequent
|
||||
/// `usable_space` calls. TODO: Invalidate reserved_space when we add the functionality
|
||||
/// to change it.
|
||||
page_size: OnceLock<u16>,
|
||||
reserved_space: OnceLock<u8>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Copy, Clone)]
|
||||
@@ -286,6 +291,8 @@ impl Pager {
|
||||
is_empty,
|
||||
init_lock,
|
||||
allocate_page1_state,
|
||||
page_size: OnceLock::new(),
|
||||
reserved_space: OnceLock::new(),
|
||||
})
|
||||
}
|
||||
|
||||
@@ -570,9 +577,15 @@ impl Pager {
|
||||
/// The usable size of a page might be an odd number. However, the usable size is not allowed to be less than 480.
|
||||
/// In other words, if the page size is 512, then the reserved space size cannot exceed 32.
|
||||
pub fn usable_space(&self) -> usize {
|
||||
let page_size = header_accessor::get_page_size(self).unwrap_or_default() as u32;
|
||||
let reserved_space = header_accessor::get_reserved_space(self).unwrap_or_default() as u32;
|
||||
(page_size - reserved_space) as usize
|
||||
let page_size = *self
|
||||
.page_size
|
||||
.get_or_init(|| header_accessor::get_page_size(self).unwrap_or_default());
|
||||
|
||||
let reserved_space = *self
|
||||
.reserved_space
|
||||
.get_or_init(|| header_accessor::get_reserved_space(self).unwrap_or_default());
|
||||
|
||||
(page_size as usize) - (reserved_space as usize)
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
|
||||
Reference in New Issue
Block a user