forked from kent/consciousness
store: internal locking, remove Arc<Mutex<Store>> wrapper
Store now has internal Mutex for capnp appends and AtomicU64 for size tracking. All methods take &self. The external Arc<Mutex<Store>> is replaced with Arc<Store>. - Store::append_lock protects file appends - local.rs functions take &Store (not &mut Store) - access_local() returns Arc<Store> - All .lock().await calls removed from callers Co-Authored-By: Proof of Concept <poc@bcachefs.org>
This commit is contained in:
parent
4696bb8b7d
commit
b3d0a3ab25
13 changed files with 86 additions and 70 deletions
|
|
@ -30,7 +30,7 @@ pub use local::{LinkInfo, JournalEntry};
|
|||
// ── Store access ───────────────────────────────────────────────
|
||||
|
||||
/// Daemon's store (eager init) or client's fallback local store.
|
||||
static STORE_ACCESS: OnceLock<Option<Arc<crate::Mutex<Store>>>> = OnceLock::new();
|
||||
static STORE_ACCESS: OnceLock<Option<Arc<Store>>> = OnceLock::new();
|
||||
|
||||
// Client's socket connection (thread-local for lock-free access).
|
||||
thread_local! {
|
||||
|
|
@ -39,9 +39,9 @@ thread_local! {
|
|||
|
||||
/// How we access the memory store.
|
||||
pub enum StoreAccess {
|
||||
Daemon(Arc<crate::Mutex<Store>>), // Direct store access
|
||||
Client, // Socket to daemon (in thread-local)
|
||||
None(String), // Error: couldn't get access
|
||||
Daemon(Arc<Store>), // Direct store access
|
||||
Client, // Socket to daemon (in thread-local)
|
||||
None(String), // Error: couldn't get access
|
||||
}
|
||||
|
||||
/// Get store access: daemon's store, socket, or local fallback.
|
||||
|
|
@ -65,7 +65,7 @@ pub fn access() -> StoreAccess {
|
|||
|
||||
// Socket failed - try local store as fallback (cached in STORE_ACCESS)
|
||||
let store_opt = STORE_ACCESS.get_or_init(|| {
|
||||
Store::load().ok().map(|s| Arc::new(crate::Mutex::new(s)))
|
||||
Store::load().ok().map(Arc::new)
|
||||
});
|
||||
|
||||
match store_opt {
|
||||
|
|
@ -75,7 +75,7 @@ pub fn access() -> StoreAccess {
|
|||
}
|
||||
|
||||
/// Get local store access. Returns error if only RPC available.
|
||||
pub fn access_local() -> Result<Arc<crate::Mutex<Store>>> {
|
||||
pub fn access_local() -> Result<Arc<Store>> {
|
||||
match access() {
|
||||
StoreAccess::Daemon(arc) => Ok(arc),
|
||||
StoreAccess::Client => anyhow::bail!("direct store access not available via RPC"),
|
||||
|
|
@ -248,12 +248,12 @@ macro_rules! memory_tool {
|
|||
if let Some(v) = $name { $map.insert(stringify!($name).into(), serde_json::json!(v)); }
|
||||
};
|
||||
|
||||
// Call hippocampus with appropriate mutability
|
||||
// Call hippocampus (all methods now take &self, deref Arc)
|
||||
(@call mut, $name:ident, $store:ident, $prov:expr $(, $arg:expr)*) => {
|
||||
local::$name(&mut $store, $prov $(, $arg)*)
|
||||
local::$name(&*$store, $prov $(, $arg)*)
|
||||
};
|
||||
(@call ref, $name:ident, $store:ident, $prov:expr $(, $arg:expr)*) => {
|
||||
local::$name(&$store, $prov $(, $arg)*)
|
||||
local::$name(&*$store, $prov $(, $arg)*)
|
||||
};
|
||||
|
||||
// ── Main rules ─────────────────────────────────────────────────
|
||||
|
|
@ -273,9 +273,7 @@ macro_rules! memory_tool {
|
|||
};
|
||||
|
||||
match access() {
|
||||
StoreAccess::Daemon(arc) => {
|
||||
#[allow(unused_mut)]
|
||||
let mut store = arc.lock().await;
|
||||
StoreAccess::Daemon(store) => {
|
||||
memory_tool!(@call $m, $name, store, &prov $($(, $arg)*)?)
|
||||
}
|
||||
StoreAccess::Client => {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue