block-db 0.2.0

Local, multi-threaded, durable byte DB.
Documentation
// Authors: Robert Lopez

use super::{state::ChunkCount, TestDB};
use crate::{BlockKey, size::ByteSize, tests::util::size_bytes};

impl TestDB {
    pub async fn free(&mut self, block_key: &BlockKey, bytes: &[u8]) -> Result<(), String> {
        let bytes_size = size_bytes(bytes, self.chunk_size);
        let freed_bytes = self.block_db.free(block_key).await.unwrap();
        let freed_chunks = freed_bytes / self.chunk_size;

        if freed_bytes != bytes_size {
            return Err(format!(
                "{freed_bytes} != {bytes_size} Invalid freed bytes count from freeing {block_key:?}"
            ));
        }

        let data_file_id = &block_key.data_file_id;

        let ByteSize {
            used_bytes: block_db_used_bytes,
            free_bytes: block_db_free_bytes,
        } = &mut self.test_state.block_db_byte_size;

        let ByteSize {
            used_bytes: data_file_used_bytes,
            free_bytes: data_file_free_bytes,
        } = self
            .test_state
            .data_file_byte_size_map
            .entry(data_file_id.to_string())
            .or_default();

        let ChunkCount { used, free } = self
            .test_state
            .data_file_chunk_count_map
            .entry(data_file_id.to_string())
            .or_default();

        *used -= freed_chunks;
        *free += freed_chunks;

        *block_db_free_bytes += freed_bytes;
        *block_db_used_bytes -= freed_bytes;

        *data_file_free_bytes += freed_bytes;
        *data_file_used_bytes -= freed_bytes;

        self.test_state
            .assert_against_block_db(&self.block_db)
            .await?;

        self.read(block_key, None).await?;

        Ok(())
    }
}