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(())
}
}