diff --git a/Cargo.toml b/Cargo.toml index b470e56..0db2b7e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ members = ["codegen", "tools/create-data-file", "tools/dump-data-file"] [package] name = "data_bucket" -version = "0.2.10" +version = "0.3.0" edition = "2021" authors = ["Handy-caT"] license = "MIT" diff --git a/src/page/index/page_for_unsized.rs b/src/page/index/page_for_unsized.rs index 55bc260..d77e54e 100644 --- a/src/page/index/page_for_unsized.rs +++ b/src/page/index/page_for_unsized.rs @@ -28,6 +28,7 @@ pub struct UnsizedIndexPage< pub node_id_size: u16, pub node_id: IndexValue, pub last_value_offset: u32, + pub removed_len: u32, pub slots: Vec<(u32, u16)>, pub index_values: Vec>, } @@ -41,6 +42,7 @@ pub struct UnsizedIndexPageUtility, pub last_value_offset: u32, + pub removed_len: u32, pub slots: Vec<(u32, u16)>, } @@ -129,6 +131,7 @@ where node_id_size: len as u16, node_id: node_id.clone(), last_value_offset: len, + removed_len: 0, slots: vec![(len, len as u16)], index_values: vec![node_id], }) @@ -154,17 +157,19 @@ where node_id, last_value_offset, slots, + removed_len: 0, index_values: values, } } - fn rebuild(&mut self) + pub fn rebuild(&mut self) where T: Clone, { self.node_id = self.index_values.last().unwrap().clone(); self.node_id_size = self.node_id.aligned_size() as u16; self.last_value_offset = 0; + self.removed_len = 0; let mut slots = vec![]; for val in &self.index_values { let len = val.aligned_size() as u32; @@ -280,6 +285,7 @@ where node_id_size: self.node_id_size, node_id: self.node_id.clone(), last_value_offset: self.last_value_offset, + removed_len: self.removed_len, slots: self.slots.clone(), }; let utility_bytes = utility.as_bytes(); @@ -335,6 +341,7 @@ where node_id: utility.node_id, last_value_offset: utility.last_value_offset, slots: utility.slots, + removed_len: utility.removed_len, index_values, } } diff --git a/src/page/index/page_for_unsized_cdc_impl.rs b/src/page/index/page_for_unsized_cdc_impl.rs index 593ac93..770624a 100644 --- a/src/page/index/page_for_unsized_cdc_impl.rs +++ b/src/page/index/page_for_unsized_cdc_impl.rs @@ -9,7 +9,10 @@ use rkyv::ser::Serializer; use rkyv::util::AlignedVec; use rkyv::{Archive, Deserialize, Serialize}; -use crate::{IndexValue, Link, SizeMeasurable, UnsizedIndexPage, VariableSizeMeasurable}; +use crate::{ + IndexValue, Link, SizeMeasurable, UnsizedIndexPage, UnsizedIndexPageUtility, + VariableSizeMeasurable, +}; impl UnsizedIndexPage where @@ -98,7 +101,14 @@ where fn apply_remove_at(&mut self, index: usize) -> eyre::Result<()> { self.slots.remove(index); self.slots_size -= 1; - self.index_values.remove(index); + let v = self.index_values.remove(index); + + self.removed_len += + (v.aligned_size() + UnsizedIndexPageUtility::::slots_value_size()) as u32; + + if self.removed_len > DATA_LENGTH / 2 { + self.rebuild(); + } Ok(()) } }