From af2ab8781066114b600fdab34fdcc5b1cfca477d Mon Sep 17 00:00:00 2001 From: Krishna Vishal Date: Fri, 27 Jun 2025 12:51:11 +0530 Subject: [PATCH] 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. --- core/storage/pager.rs | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/core/storage/pager.rs b/core/storage/pager.rs index 97b6d6146..1c7e4720a 100644 --- a/core/storage/pager.rs +++ b/core/storage/pager.rs @@ -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>, allocate_page1_state: RefCell, + /// 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, + reserved_space: OnceLock, } #[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)]