use std::process;
use std::sync::atomic::{AtomicU64, Ordering};
use std::time::{SystemTime, UNIX_EPOCH};
use rand::Rng;
pub struct RedLockHelper;
impl RedLockHelper {
pub fn has_sufficient_successes(success_count: usize, database_count: usize) -> bool {
let threshold = (database_count / 2) + 1;
success_count >= threshold
}
pub fn has_too_many_failures_or_faults(
failure_or_fault_count: usize,
database_count: usize,
) -> bool {
let threshold = (database_count / 2) + (database_count % 2);
failure_or_fault_count >= threshold
}
pub fn create_lock_id() -> String {
static COUNTER: AtomicU64 = AtomicU64::new(0);
let counter = COUNTER.fetch_add(1, Ordering::Relaxed);
let pid = process::id();
let mut rng = rand::thread_rng();
let random: u64 = rng.r#gen();
format!("{}_{}_{:016x}", pid, counter, random)
}
pub fn now_millis() -> u64 {
SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_millis() as u64
}
}