bitcasky 0.1.2

Bitcasky is a Rust implementation of the Bitcask key-value store
Documentation
use std::ops::Add;

use log::info;
use parking_lot::Mutex;

pub type StorageId = u32;

#[derive(Debug)]
pub struct StorageIdGenerator {
    id: Mutex<StorageId>,
}

impl StorageIdGenerator {
    pub fn generate_next_id(&self) -> StorageId {
        let mut id = self.id.lock();
        let next_id = id.add(1);
        *id = next_id;
        next_id
    }

    pub fn update_id(&self, known_max_storage_id: StorageId) {
        let mut id = self.id.lock();
        if known_max_storage_id < *id {
            return;
        }
        *id = known_max_storage_id;
        info!(target: "StorageIdGenerator", "update storage id to {}", *id);
    }

    #[allow(dead_code)]
    pub fn get_id(&self) -> StorageId {
        *self.id.lock()
    }
}

impl Default for StorageIdGenerator {
    fn default() -> Self {
        StorageIdGenerator { id: Mutex::new(0) }
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use test_log::test;

    #[test]
    fn test_generate_id() {
        let id_gen = StorageIdGenerator::default();
        assert_eq!(1, id_gen.generate_next_id());
        assert_eq!(2, id_gen.generate_next_id());
        assert_eq!(3, id_gen.generate_next_id());
        assert_eq!(3, id_gen.get_id());
    }

    #[test]
    fn test_update_storage_id() {
        let id_gen = StorageIdGenerator::default();
        assert_eq!(1, id_gen.generate_next_id());
        id_gen.update_id(10);
        assert_eq!(11, id_gen.generate_next_id());
        assert_eq!(12, id_gen.generate_next_id());
        assert_eq!(12, id_gen.get_id());
    }
}