mod blob;
mod kv;
use std::sync::{Mutex, MutexGuard, PoisonError};
use crate::store::StoreError;
#[cfg(test)]
pub(crate) use blob::MemoryPartSink;
pub use blob::{MemoryBlobStore, MemoryPackSink};
pub use kv::MemoryKv;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum MemoryFault {
ApplyBefore,
ApplyAfterCommit,
BlobWrite(u32),
BlobCommit,
}
fn lock<T>(mutex: &Mutex<T>) -> MutexGuard<'_, T> {
mutex.lock().unwrap_or_else(PoisonError::into_inner)
}
fn take_fault(armed: &Mutex<Option<MemoryFault>>, fault: MemoryFault) -> Result<(), StoreError> {
let mut armed = lock(armed);
if *armed == Some(fault) {
*armed = None;
return Err(StoreError::unavailable(format!("injected fault {fault:?}")));
}
Ok(())
}