bitcasky_common/
storage_id.rs

1use 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}