Created
January 6, 2023 14:38
-
-
Save ChillFish8/c0ca456a1ef4171fdbe38dddfdcd31e3 to your computer and use it in GitHub Desktop.
The CRDT implementation with a timestamp.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
use std::time::Duration; | |
use datacake_crdt::{OrSWotSet, HLCTimestamp}; | |
fn main() { | |
let mut node_a = HLCTimestamp::now(0, 0); | |
// Simulating a node begin slightly ahead in time. | |
let mut node_b = HLCTimestamp::new(node_a.datacake_timestamp() + Duration::from_secs(5), 0, 1); | |
let mut node_a_set = OrSWotSet::default(); | |
let mut node_b_set = OrSWotSet::default(); | |
// Insert a new key with a new timestamp in set A. | |
node_a_set.insert(1, node_a.send().unwrap()); | |
// Insert a new entry in set B. | |
node_b_set.insert(2, node_b.send().unwrap()); | |
// Let some time pass for demonstration purposes. | |
std::thread::sleep(Duration::from_millis(500)); | |
// Set A has key `1` removed. | |
node_a_set.delete(1, node_a.send().unwrap()); | |
// Merging set B with set A and vice versa. | |
// Our sets are now aligned without conflicts. | |
node_b_set.merge(node_a_set.clone()); | |
node_a_set.merge(node_b_set.clone()); | |
// Set A and B should both see that key `1` has been deleted. | |
assert!(node_a_set.get(&1).is_none(), "Key should be correctly removed."); | |
assert!(node_b_set.get(&1).is_none(), "Key should be correctly removed."); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment