core: Rename FileStorage to DatabaseFile

This commit is contained in:
Pekka Enberg 2025-03-25 11:14:11 +02:00
parent 1f29e1fe08
commit df6af6ed79
6 changed files with 47 additions and 46 deletions

View file

@ -21,8 +21,8 @@ impl Database {
.open_file(path, limbo_core::OpenFlags::Create, false)
.unwrap();
maybe_init_database_file(&file, &io).unwrap();
let page_io = Arc::new(DatabaseStorage::new(file));
let db_header = Pager::begin_open(page_io.clone()).unwrap();
let db_file = Arc::new(DatabaseFile::new(file));
let db_header = Pager::begin_open(db_file.clone()).unwrap();
// ensure db header is there
io.run_once().unwrap();
@ -32,7 +32,7 @@ impl Database {
let wal_path = format!("{}-wal", path);
let wal_shared = WalFileShared::open_shared(&io, wal_path.as_str(), page_size).unwrap();
let db = limbo_core::Database::open(io, page_io, wal_shared, false).unwrap();
let db = limbo_core::Database::open(io, db_file, wal_shared, false).unwrap();
let conn = db.connect().unwrap();
Database { db, conn }
}
@ -315,19 +315,20 @@ extern "C" {
fn toISOString(this: &Date) -> String;
}
pub struct DatabaseStorage {
pub struct DatabaseFile {
file: Arc<dyn limbo_core::File>,
}
unsafe impl Send for DatabaseStorage {}
unsafe impl Sync for DatabaseStorage {}
impl DatabaseStorage {
unsafe impl Send for DatabaseFile {}
unsafe impl Sync for DatabaseFile {}
impl DatabaseFile {
pub fn new(file: Arc<dyn limbo_core::File>) -> Self {
Self { file }
}
}
impl limbo_core::DatabaseStorage for DatabaseStorage {
impl limbo_core::DatabaseStorage for DatabaseFile {
fn read_page(&self, page_idx: usize, c: limbo_core::Completion) -> Result<()> {
let r = match c {
limbo_core::Completion::Read(ref r) => r,

View file

@ -47,7 +47,7 @@ use std::{
};
use storage::btree::btree_init_page;
#[cfg(feature = "fs")]
use storage::database::FileStorage;
use storage::database::DatabaseFile;
pub use storage::{
buffer_pool::BufferPool,
database::DatabaseStorage,
@ -84,7 +84,7 @@ pub struct Database {
schema: Arc<RwLock<Schema>>,
// TODO: make header work without lock
header: Arc<SpinLock<DatabaseHeader>>,
page_io: Arc<dyn DatabaseStorage>,
db_file: Arc<dyn DatabaseStorage>,
io: Arc<dyn IO>,
page_size: u16,
// Shared structures of a Database are the parts that are common to multiple threads that might
@ -103,23 +103,23 @@ impl Database {
let file = io.open_file(path, OpenFlags::Create, true)?;
maybe_init_database_file(&file, &io)?;
let page_io = Arc::new(FileStorage::new(file));
let db_file = Arc::new(DatabaseFile::new(file));
let wal_path = format!("{}-wal", path);
let db_header = Pager::begin_open(page_io.clone())?;
let db_header = Pager::begin_open(db_file.clone())?;
io.run_once()?;
let page_size = db_header.lock().page_size;
let wal_shared = WalFileShared::open_shared(&io, wal_path.as_str(), page_size)?;
Self::open(io, page_io, wal_shared, enable_mvcc)
Self::open(io, db_file, wal_shared, enable_mvcc)
}
#[allow(clippy::arc_with_non_send_sync)]
pub fn open(
io: Arc<dyn IO>,
page_io: Arc<dyn DatabaseStorage>,
db_file: Arc<dyn DatabaseStorage>,
shared_wal: Arc<RwLock<WalFileShared>>,
enable_mvcc: bool,
) -> Result<Arc<Database>> {
let db_header = Pager::begin_open(page_io.clone())?;
let db_header = Pager::begin_open(db_file.clone())?;
io.run_once()?;
DATABASE_VERSION.get_or_init(|| {
let version = db_header.lock().version_number;
@ -143,7 +143,7 @@ impl Database {
header: header.clone(),
shared_page_cache: shared_page_cache.clone(),
shared_wal: shared_wal.clone(),
page_io,
db_file,
io: io.clone(),
page_size,
};
@ -172,7 +172,7 @@ impl Database {
)));
let pager = Rc::new(Pager::finish_open(
self.header.clone(),
self.page_io.clone(),
self.db_file.clone(),
wal,
self.io.clone(),
self.shared_page_cache.clone(),

View file

@ -3159,7 +3159,7 @@ mod tests {
use super::*;
use crate::fast_lock::SpinLock;
use crate::io::{Buffer, Completion, MemoryIO, OpenFlags, IO};
use crate::storage::database::FileStorage;
use crate::storage::database::DatabaseFile;
use crate::storage::page_cache::DumbLruPageCache;
use crate::storage::sqlite3_ondisk;
use crate::storage::sqlite3_ondisk::DatabaseHeader;
@ -3443,7 +3443,7 @@ mod tests {
#[allow(clippy::arc_with_non_send_sync)]
let io: Arc<dyn IO> = Arc::new(MemoryIO::new());
let io_file = io.open_file("test.db", OpenFlags::Create, false).unwrap();
let page_io = Arc::new(FileStorage::new(io_file));
let db_file = Arc::new(DatabaseFile::new(io_file));
let buffer_pool = Rc::new(BufferPool::new(db_header.page_size as usize));
let wal_shared = WalFileShared::open_shared(&io, "test.wal", db_header.page_size).unwrap();
@ -3453,7 +3453,7 @@ mod tests {
let page_cache = Arc::new(parking_lot::RwLock::new(DumbLruPageCache::new(10)));
let pager = {
let db_header = Arc::new(SpinLock::new(db_header.clone()));
Pager::finish_open(db_header, page_io, wal, io, page_cache, buffer_pool).unwrap()
Pager::finish_open(db_header, db_file, wal, io, page_cache, buffer_pool).unwrap()
};
let pager = Rc::new(pager);
let page1 = pager.allocate_page().unwrap();
@ -3700,7 +3700,7 @@ mod tests {
}
let io: Arc<dyn IO> = Arc::new(MemoryIO::new());
let page_io = Arc::new(FileStorage::new(
let db_file = Arc::new(DatabaseFile::new(
io.open_file("test.db", OpenFlags::Create, false).unwrap(),
));
@ -3714,7 +3714,7 @@ mod tests {
let write_complete = Box::new(|_| {});
let c = Completion::Write(WriteCompletion::new(write_complete));
page_io.write_page(1, buf.clone(), c).unwrap();
db_file.write_page(1, buf.clone(), c).unwrap();
let wal_shared = WalFileShared::open_shared(&io, "test.wal", page_size).unwrap();
let wal = Rc::new(RefCell::new(WalFile::new(
@ -3727,7 +3727,7 @@ mod tests {
let pager = Rc::new(
Pager::finish_open(
db_header.clone(),
page_io,
db_file,
wal,
io,
Arc::new(parking_lot::RwLock::new(DumbLruPageCache::new(10))),
@ -3765,7 +3765,7 @@ mod tests {
let write_complete = Box::new(|_| {});
let c = Completion::Write(WriteCompletion::new(write_complete));
pager
.page_io
.db_file
.write_page(current_page as usize, buf.clone(), c)?;
pager.io.run_once()?;

View file

@ -20,17 +20,17 @@ pub trait DatabaseStorage: Send + Sync {
}
#[cfg(feature = "fs")]
pub struct FileStorage {
pub struct DatabaseFile {
file: Arc<dyn crate::io::File>,
}
#[cfg(feature = "fs")]
unsafe impl Send for FileStorage {}
unsafe impl Send for DatabaseFile {}
#[cfg(feature = "fs")]
unsafe impl Sync for FileStorage {}
unsafe impl Sync for DatabaseFile {}
#[cfg(feature = "fs")]
impl DatabaseStorage for FileStorage {
impl DatabaseStorage for DatabaseFile {
fn read_page(&self, page_idx: usize, c: Completion) -> Result<()> {
let r = c.as_read();
let size = r.buf().len();
@ -64,7 +64,7 @@ impl DatabaseStorage for FileStorage {
}
#[cfg(feature = "fs")]
impl FileStorage {
impl DatabaseFile {
pub fn new(file: Arc<dyn crate::io::File>) -> Self {
Self { file }
}

View file

@ -153,7 +153,7 @@ struct FlushInfo {
/// transaction management.
pub struct Pager {
/// Source of the database pages.
pub page_io: Arc<dyn DatabaseStorage>,
pub db_file: Arc<dyn DatabaseStorage>,
/// The write-ahead log (WAL) for the database.
wal: Rc<RefCell<dyn Wal>>,
/// A page cache for the database.
@ -173,21 +173,21 @@ pub struct Pager {
impl Pager {
/// Begins opening a database by reading the database header.
pub fn begin_open(page_io: Arc<dyn DatabaseStorage>) -> Result<Arc<SpinLock<DatabaseHeader>>> {
sqlite3_ondisk::begin_read_database_header(page_io)
pub fn begin_open(db_file: Arc<dyn DatabaseStorage>) -> Result<Arc<SpinLock<DatabaseHeader>>> {
sqlite3_ondisk::begin_read_database_header(db_file)
}
/// Completes opening a database by initializing the Pager with the database header.
pub fn finish_open(
db_header_ref: Arc<SpinLock<DatabaseHeader>>,
page_io: Arc<dyn DatabaseStorage>,
db_file: Arc<dyn DatabaseStorage>,
wal: Rc<RefCell<dyn Wal>>,
io: Arc<dyn crate::io::IO>,
page_cache: Arc<RwLock<DumbLruPageCache>>,
buffer_pool: Rc<BufferPool>,
) -> Result<Self> {
Ok(Self {
page_io,
db_file,
wal,
page_cache,
io,
@ -285,7 +285,7 @@ impl Pager {
return Ok(page);
}
sqlite3_ondisk::begin_read_page(
self.page_io.clone(),
self.db_file.clone(),
self.buffer_pool.clone(),
page.clone(),
page_idx,
@ -316,7 +316,7 @@ impl Pager {
return Ok(());
}
sqlite3_ondisk::begin_read_page(
self.page_io.clone(),
self.db_file.clone(),
self.buffer_pool.clone(),
page.clone(),
id,
@ -407,7 +407,7 @@ impl Pager {
};
}
FlushState::SyncDbFile => {
sqlite3_ondisk::begin_sync(self.page_io.clone(), self.syncing.clone())?;
sqlite3_ondisk::begin_sync(self.db_file.clone(), self.syncing.clone())?;
self.flush_info.borrow_mut().state = FlushState::WaitSyncDbFile;
}
FlushState::WaitSyncDbFile => {
@ -444,7 +444,7 @@ impl Pager {
};
}
CheckpointState::SyncDbFile => {
sqlite3_ondisk::begin_sync(self.page_io.clone(), self.syncing.clone())?;
sqlite3_ondisk::begin_sync(self.db_file.clone(), self.syncing.clone())?;
self.checkpoint_state
.replace(CheckpointState::WaitSyncDbFile);
}

View file

@ -244,7 +244,7 @@ impl Default for DatabaseHeader {
}
pub fn begin_read_database_header(
page_io: Arc<dyn DatabaseStorage>,
db_file: Arc<dyn DatabaseStorage>,
) -> Result<Arc<SpinLock<DatabaseHeader>>> {
let drop_fn = Rc::new(|_buf| {});
#[allow(clippy::arc_with_non_send_sync)]
@ -256,7 +256,7 @@ pub fn begin_read_database_header(
finish_read_database_header(buf, header).unwrap();
});
let c = Completion::Read(ReadCompletion::new(buf, complete));
page_io.read_page(1, c)?;
db_file.read_page(1, c)?;
Ok(result)
}
@ -297,7 +297,7 @@ fn finish_read_database_header(
}
pub fn begin_write_database_header(header: &DatabaseHeader, pager: &Pager) -> Result<()> {
let page_source = pager.page_io.clone();
let page_source = pager.db_file.clone();
let header = Rc::new(header.clone());
let drop_fn = Rc::new(|_buf| {});
@ -700,7 +700,7 @@ impl PageContent {
}
pub fn begin_read_page(
page_io: Arc<dyn DatabaseStorage>,
db_file: Arc<dyn DatabaseStorage>,
buffer_pool: Rc<BufferPool>,
page: PageRef,
page_idx: usize,
@ -720,7 +720,7 @@ pub fn begin_read_page(
}
});
let c = Completion::Read(ReadCompletion::new(buf, complete));
page_io.read_page(page_idx, c)?;
db_file.read_page(page_idx, c)?;
Ok(())
}
@ -755,7 +755,7 @@ pub fn begin_write_btree_page(
write_counter: Rc<RefCell<usize>>,
) -> Result<()> {
trace!("begin_write_btree_page(page={})", page.get().id);
let page_source = &pager.page_io;
let page_source = &pager.db_file;
let page_finish = page.clone();
let page_id = page.get().id;
@ -786,7 +786,7 @@ pub fn begin_write_btree_page(
Ok(())
}
pub fn begin_sync(page_io: Arc<dyn DatabaseStorage>, syncing: Rc<RefCell<bool>>) -> Result<()> {
pub fn begin_sync(db_file: Arc<dyn DatabaseStorage>, syncing: Rc<RefCell<bool>>) -> Result<()> {
assert!(!*syncing.borrow());
*syncing.borrow_mut() = true;
let completion = Completion::Sync(SyncCompletion {
@ -794,7 +794,7 @@ pub fn begin_sync(page_io: Arc<dyn DatabaseStorage>, syncing: Rc<RefCell<bool>>)
*syncing.borrow_mut() = false;
}),
});
page_io.sync(completion)?;
db_file.sync(completion)?;
Ok(())
}