use std::sync::atomic::AtomicBool;
use std::sync::{Mutex, MutexGuard};
pub static WAL_WRITE_FAIL: AtomicBool = AtomicBool::new(false);
pub static WAL_SYNC_FAIL: AtomicBool = AtomicBool::new(false);
pub static SNAPSHOT_WRITE_FAIL: AtomicBool = AtomicBool::new(false);
pub static SNAPSHOT_SYNC_FAIL: AtomicBool = AtomicBool::new(false);
pub static SNAPSHOT_RENAME_FAIL: AtomicBool = AtomicBool::new(false);
pub static CHECKPOINT_WRITE_FAIL: AtomicBool = AtomicBool::new(false);
static FAILPOINT_LOCK: Mutex<()> = Mutex::new(());
pub fn reset_all() {
use std::sync::atomic::Ordering::Release;
WAL_WRITE_FAIL.store(false, Release);
WAL_SYNC_FAIL.store(false, Release);
SNAPSHOT_WRITE_FAIL.store(false, Release);
SNAPSHOT_SYNC_FAIL.store(false, Release);
SNAPSHOT_RENAME_FAIL.store(false, Release);
CHECKPOINT_WRITE_FAIL.store(false, Release);
}
pub struct FailpointGuard {
_lock: MutexGuard<'static, ()>,
}
impl FailpointGuard {
pub fn new() -> Self {
let lock = FAILPOINT_LOCK.lock().unwrap_or_else(|e| e.into_inner());
reset_all();
FailpointGuard { _lock: lock }
}
}
impl Default for FailpointGuard {
fn default() -> Self {
Self::new()
}
}
impl Drop for FailpointGuard {
fn drop(&mut self) {
reset_all();
}
}