From 79aad05f1accebd948cba7aa4f9ff31add7ffc01 Mon Sep 17 00:00:00 2001 From: Ron Kuris Date: Thu, 27 Apr 2023 14:23:28 +0000 Subject: [PATCH] 2/3: Postpone cloning the db_path Want access to it after the last init_wal for better errors --- firewood/src/db.rs | 5 ++++- firewood/src/storage/buffer.rs | 27 ++++++++++++++------------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/firewood/src/db.rs b/firewood/src/db.rs index c53f33497..f05b96296 100644 --- a/firewood/src/db.rs +++ b/firewood/src/db.rs @@ -665,6 +665,9 @@ impl Db> { disk_requester.reg_cached_space(cached_space.id(), cached_space.clone_files()); }); + // recover from WAL + disk_requester.init_wal("wal", &db_path); + // set up the storage layout let db_header: ObjPtr = ObjPtr::new_from_addr(offset); @@ -712,7 +715,7 @@ impl Db> { let root_hash_staging = StoreRevMut::new(root_hash_cache); // recover from Wal - disk_requester.init_wal("wal", db_path); + disk_requester.init_wal("wal", &db_path); let (mut db_header_ref, merkle_payload_header_ref, _blob_payload_header_ref) = { let merkle_meta_ref = data_staging.merkle.meta.as_ref(); diff --git a/firewood/src/storage/buffer.rs b/firewood/src/storage/buffer.rs index 487f3c825..67255d6a0 100644 --- a/firewood/src/storage/buffer.rs +++ b/firewood/src/storage/buffer.rs @@ -1,4 +1,11 @@ //! Disk buffer for staging in memory pages and flushing them to disk. +use std::fmt::Debug; +use std::ops::IndexMut; +use std::path::{Path, PathBuf}; +use std::rc::Rc; +use std::sync::Arc; +use std::{cell::RefCell, collections::HashMap}; + use super::{AshRecord, FilePool, Page, StoreDelta, StoreError, WalConfig, PAGE_SIZE_NBIT}; use crate::storage::DeltaPage; use aiofut::{AioBuilder, AioError, AioManager}; @@ -9,15 +16,6 @@ use growthring::{ WalFileImpl, WalStoreImpl, }; use shale::SpaceId; -use std::{ - cell::RefCell, - collections::HashMap, - fmt::Debug, - ops::IndexMut, - path::{Path, PathBuf}, - rc::Rc, - sync::Arc, -}; use tokio::{ sync::{ mpsc, @@ -581,9 +579,12 @@ impl DiskBufferRequester { } /// Initialize the Wal. - pub fn init_wal(&self, waldir: &str, rootpath: PathBuf) { + pub fn init_wal(&self, waldir: &str, rootpath: &Path) { self.sender - .blocking_send(BufferCmd::InitWal(rootpath, waldir.to_string())) + .blocking_send(BufferCmd::InitWal( + rootpath.to_path_buf(), + waldir.to_string(), + )) .map_err(StoreError::Send) .ok(); } @@ -645,7 +646,7 @@ mod tests { let state_path = file::touch_dir("state", &root_db_path).unwrap(); assert!(reset); // create a new wal directory on top of root_db_fd - disk_requester.init_wal("wal", root_db_path); + disk_requester.init_wal("wal", &root_db_path); // create a new state cache which tracks on disk state. let state_cache = Arc::new( @@ -733,7 +734,7 @@ mod tests { let state_path = file::touch_dir("state", &root_db_path).unwrap(); assert!(reset); // create a new wal directory on top of root_db_fd - disk_requester.init_wal("wal", root_db_path); + disk_requester.init_wal("wal", &root_db_path); // create a new state cache which tracks on disk state. let state_cache = Arc::new(