use std::error::Error; use std::thread; use std::time::Duration; use redsync::{RedisInstance, Redsync, RedsyncError}; fn main() { if let Err(err) = run() { println!("{}", err); } } fn run() -> Result<(), Box> { let dlm = Redsync::new(vec![ RedisInstance::new("redis://127.0.0.1:6389")?, RedisInstance::new("redis://127.0.0.1:6399")?, RedisInstance::new("redis://127.0.0.1:6379")?, ]); let lock1 = dlm .lock("resource", Duration::from_secs(1)) .map_err(|err| format!("Failed to acquire lock on resource: {}", err))?; println!("[t = 0] Acquired 1st lock for 1 second!"); println!("[t = 0] Sleeping for 1 second!"); thread::sleep(Duration::from_secs(1)); let lock2 = dlm .lock("resource", Duration::from_secs(2)) .map_err(|err| format!("Failed to acquire lock on resource: {}", err))?; println!("[t = 1] Acquired 2nd lock for 2 seconds!"); println!("[t = 1] Sleeping for 1 second!"); thread::sleep(Duration::from_secs(1)); match dlm.unlock(&lock1) { Ok(()) => println!("[t = 2] Released 1st lock after 2 seconds!"), Err(RedsyncError::UnlockFailed(err)) => { if err.includes(RedsyncError::InvalidLease) { println!("[t = 2] Failed to release 1st lock. Lock has expired!") } } Err(err) => println!("[t = 2] Unexpected error: {}", err), }; dlm.extend(&lock2, Duration::from_secs(2)) .map_err(|err| format!("Failed to extend lock on resource: {}", err))?; println!("[t = 2] Extended 2nd lock for 2 seconds!"); println!("[t = 2] Sleeping for 1 second!"); thread::sleep(Duration::from_secs(1)); dlm.unlock(&lock2) .map_err(|err| format!("Failed to release lock on resource: {}", err))?; println!("[t = 3] Released 2nd lock after 1 second!"); Ok(()) }