@@ -1,3 +1,4 @@
|
||||
pub(crate) mod bloom;
|
||||
mod builder;
|
||||
mod iterator;
|
||||
|
||||
@@ -13,6 +14,8 @@ pub use iterator::SsTableIterator;
|
||||
use crate::block::Block;
|
||||
use crate::lsm_storage::BlockCache;
|
||||
|
||||
use self::bloom::Bloom;
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||
pub struct BlockMeta {
|
||||
/// Offset of this data block.
|
||||
@@ -107,16 +110,20 @@ impl FileObject {
|
||||
}
|
||||
}
|
||||
|
||||
/// An SSTable.
|
||||
pub struct SsTable {
|
||||
file: FileObject,
|
||||
block_meta: Vec<BlockMeta>,
|
||||
block_meta_offset: usize,
|
||||
/// The actual storage unit of SsTable, the format is as above.
|
||||
pub(crate) file: FileObject,
|
||||
/// The meta blocks that hold info for data blocks.
|
||||
pub(crate) block_meta: Vec<BlockMeta>,
|
||||
/// The offset that indicates the start point of meta blocks in `file`.
|
||||
pub(crate) block_meta_offset: usize,
|
||||
id: usize,
|
||||
block_cache: Option<Arc<BlockCache>>,
|
||||
first_key: Bytes,
|
||||
last_key: Bytes,
|
||||
pub(crate) bloom: Option<Bloom>,
|
||||
}
|
||||
|
||||
impl SsTable {
|
||||
#[cfg(test)]
|
||||
pub(crate) fn open_for_test(file: FileObject) -> Result<Self> {
|
||||
@@ -126,9 +133,13 @@ impl SsTable {
|
||||
/// Open SSTable from a file.
|
||||
pub fn open(id: usize, block_cache: Option<Arc<BlockCache>>, file: FileObject) -> Result<Self> {
|
||||
let len = file.size();
|
||||
let raw_meta_offset = file.read(len - 4, 4)?;
|
||||
let raw_bloom_offset = file.read(len - 4, 4)?;
|
||||
let bloom_offset = (&raw_bloom_offset[..]).get_u32() as u64;
|
||||
let raw_bloom = file.read(bloom_offset, len - 4 - bloom_offset)?;
|
||||
let bloom_filter = Bloom::decode(&raw_bloom);
|
||||
let raw_meta_offset = file.read(bloom_offset - 4, 4)?;
|
||||
let block_meta_offset = (&raw_meta_offset[..]).get_u32() as u64;
|
||||
let raw_meta = file.read(block_meta_offset, len - 4 - block_meta_offset)?;
|
||||
let raw_meta = file.read(block_meta_offset, bloom_offset - 4 - block_meta_offset)?;
|
||||
let block_meta = BlockMeta::decode_block_meta(&raw_meta[..]);
|
||||
Ok(Self {
|
||||
file,
|
||||
@@ -138,6 +149,7 @@ impl SsTable {
|
||||
block_meta_offset: block_meta_offset as usize,
|
||||
id,
|
||||
block_cache,
|
||||
bloom: Some(bloom_filter),
|
||||
})
|
||||
}
|
||||
|
||||
@@ -151,6 +163,7 @@ impl SsTable {
|
||||
block_cache: None,
|
||||
first_key,
|
||||
last_key,
|
||||
bloom: None,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -207,6 +220,3 @@ impl SsTable {
|
||||
self.id
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
|
||||
Reference in New Issue
Block a user