bitcasky_common/
storage_id.rs1use std::ops::Add;
2
3use log::info;
4use parking_lot::Mutex;
5
6pub type StorageId = u32;
7
8#[derive(Debug)]
9pub struct StorageIdGenerator {
10 id: Mutex<StorageId>,
11}
12
13impl StorageIdGenerator {
14 pub fn generate_next_id(&self) -> StorageId {
15 let mut id = self.id.lock();
16 let next_id = id.add(1);
17 *id = next_id;
18 next_id
19 }
20
21 pub fn update_id(&self, known_max_storage_id: StorageId) {
22 let mut id = self.id.lock();
23 if known_max_storage_id < *id {
24 return;
25 }
26 *id = known_max_storage_id;
27 info!(target: "StorageIdGenerator", "update storage id to {}", *id);
28 }
29
30 #[allow(dead_code)]
31 pub fn get_id(&self) -> StorageId {
32 *self.id.lock()
33 }
34}
35
36impl Default for StorageIdGenerator {
37 fn default() -> Self {
38 StorageIdGenerator { id: Mutex::new(0) }
39 }
40}
41
42#[cfg(test)]
43mod tests {
44 use super::*;
45 use test_log::test;
46
47 #[test]
48 fn test_generate_id() {
49 let id_gen = StorageIdGenerator::default();
50 assert_eq!(1, id_gen.generate_next_id());
51 assert_eq!(2, id_gen.generate_next_id());
52 assert_eq!(3, id_gen.generate_next_id());
53 assert_eq!(3, id_gen.get_id());
54 }
55
56 #[test]
57 fn test_update_storage_id() {
58 let id_gen = StorageIdGenerator::default();
59 assert_eq!(1, id_gen.generate_next_id());
60 id_gen.update_id(10);
61 assert_eq!(11, id_gen.generate_next_id());
62 assert_eq!(12, id_gen.generate_next_id());
63 assert_eq!(12, id_gen.get_id());
64 }
65}