1use std::error::Error;
2use std::thread;
3use std::time::Duration;
4
5use redsync::{RedisInstance, Redsync, RedsyncError};
6
7fn main() {
8 if let Err(err) = run() {
9 println!("{}", err);
10 }
11}
12
13fn run() -> Result<(), Box<dyn Error>> {
14 let dlm = Redsync::new(vec![
15 RedisInstance::new("redis://127.0.0.1:6389")?,
16 RedisInstance::new("redis://127.0.0.1:6399")?,
17 RedisInstance::new("redis://127.0.0.1:6379")?,
18 ]);
19
20 let lock1 = dlm
21 .lock("resource", Duration::from_secs(1))
22 .map_err(|err| format!("Failed to acquire lock on resource: {}", err))?;
23 println!("[t = 0] Acquired 1st lock for 1 second!");
24
25 println!("[t = 0] Sleeping for 1 second!");
26 thread::sleep(Duration::from_secs(1));
27
28 let lock2 = dlm
29 .lock("resource", Duration::from_secs(2))
30 .map_err(|err| format!("Failed to acquire lock on resource: {}", err))?;
31 println!("[t = 1] Acquired 2nd lock for 2 seconds!");
32
33 println!("[t = 1] Sleeping for 1 second!");
34 thread::sleep(Duration::from_secs(1));
35
36 match dlm.unlock(&lock1) {
37 Ok(()) => println!("[t = 2] Released 1st lock after 2 seconds!"),
38 Err(RedsyncError::UnlockFailed(err)) => {
39 if err.includes(RedsyncError::InvalidLease) {
40 println!("[t = 2] Failed to release 1st lock. Lock has expired!")
41 }
42 }
43 Err(err) => println!("[t = 2] Unexpected error: {}", err),
44 };
45
46 dlm.extend(&lock2, Duration::from_secs(2))
47 .map_err(|err| format!("Failed to extend lock on resource: {}", err))?;
48 println!("[t = 2] Extended 2nd lock for 2 seconds!");
49
50 println!("[t = 2] Sleeping for 1 second!");
51 thread::sleep(Duration::from_secs(1));
52
53 dlm.unlock(&lock2)
54 .map_err(|err| format!("Failed to release lock on resource: {}", err))?;
55 println!("[t = 3] Released 2nd lock after 1 second!");
56
57 Ok(())
58}