From af2ab8781066114b600fdab34fdcc5b1cfca477d Mon Sep 17 00:00:00 2001 From: Krishna Vishal Date: Fri, 27 Jun 2025 12:51:11 +0530 Subject: [PATCH 1/2] 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)] From cda1ab8d76097eb4634cf411e3c03b77dafc9d67 Mon Sep 17 00:00:00 2001 From: Krishna Vishal Date: Fri, 27 Jun 2025 13:32:03 +0530 Subject: [PATCH 2/2] Use `OnceCell` instead of `OnceLock`. --- core/storage/pager.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/storage/pager.rs b/core/storage/pager.rs index 1c7e4720a..9a2db6f62 100644 --- a/core/storage/pager.rs +++ b/core/storage/pager.rs @@ -9,11 +9,11 @@ use crate::types::CursorResult; use crate::{Buffer, LimboError, Result}; use crate::{Completion, WalFile}; use parking_lot::RwLock; -use std::cell::{RefCell, UnsafeCell}; +use std::cell::{OnceCell, RefCell, UnsafeCell}; use std::collections::HashSet; use std::rc::Rc; use std::sync::atomic::{AtomicUsize, Ordering}; -use std::sync::{Arc, Mutex, OnceLock}; +use std::sync::{Arc, Mutex}; use tracing::{trace, Level}; use super::btree::{btree_init_page, BTreePage}; @@ -225,8 +225,8 @@ pub struct Pager { /// 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, + page_size: OnceCell, + reserved_space: OnceCell, } #[derive(Debug, Copy, Clone)] @@ -291,8 +291,8 @@ impl Pager { is_empty, init_lock, allocate_page1_state, - page_size: OnceLock::new(), - reserved_space: OnceLock::new(), + page_size: OnceCell::new(), + reserved_space: OnceCell::new(), }) }