mintkv/chunk/
mod.rs

1use crate::errors::Error;
2
3mod skiplist;
4
5pub(crate) struct Chunk {
6    store: skiplist::SkipList,
7    total_size: usize,
8    used_size: usize,
9    key_nums: usize,
10}
11
12const DEFAULT_MAX_CHUNK_SIZE: usize = 1024;
13
14// Chunk[#TODO] (should add some comments)
15impl Chunk {
16    pub(crate) fn new() -> Self {
17        Chunk {
18            store: skiplist::SkipList::default(),
19            total_size: DEFAULT_MAX_CHUNK_SIZE,
20            used_size: 0,
21            key_nums: 0,
22        }
23    }
24}
25
26/* // Default[#TODO] (should add some comments)
27impl Default for Chunk {
28    fn default() -> Self {
29        Chunk {
30            store: skiplist::SkipList::default(),
31            total_size: DEFAULT_MAX_CHUNK_SIZE,
32            used_size: 0,
33            key_nums: 0,
34            first_key: Vec::default(),
35        }
36    }
37} */
38// Chunk[#TODO] (should add some comments)
39impl Chunk {
40    // chunk disk layout
41    // |----------------------------------------------------------------------------------|
42    // | key_num |  1st off | .| end off |k1_size|k1 | v1_size | v1 | ....................|
43    // |----------------------------------------------------------------------------------|
44    // |  8B     |  2B      | .|  2B     |  2B   |x  |  2B     | x  |  ......   ....      |
45    // |--------------------------------------------------------------|-------------------|
46    pub(crate) fn serialize(self) -> (Vec<u8>, Vec<u8>) {
47        let mut buffer = vec![0u8; self.key_nums * (8 + 8 + 8) + 8 + self.used_size];
48        let mut offset = 0;
49        buffer[offset..offset + 8].clone_from_slice(self.key_nums.to_le_bytes().as_ref());
50        offset += 8;
51
52        let mut ptr_pos = offset;
53        offset += 8 * self.key_nums;
54
55        let mut fist_key = None;
56
57        let store_iter = self.store.into_iter();
58        for (key, value) in store_iter {
59            if fist_key.is_none() {
60                fist_key = Some(key.clone());
61            }
62            buffer[ptr_pos..ptr_pos + 8].clone_from_slice(offset.to_le_bytes().as_ref());
63            ptr_pos += 8;
64
65            buffer[offset..offset + 8].clone_from_slice(key.len().to_le_bytes().as_ref());
66            offset += 8;
67
68            buffer[offset..offset + key.len()].clone_from_slice(&key);
69            offset += key.len();
70
71            buffer[offset..offset + 8].clone_from_slice(value.len().to_le_bytes().as_ref());
72            offset += 8;
73
74            buffer[offset..offset + value.len()].clone_from_slice(&value);
75            offset += value.len();
76        }
77
78        (fist_key.unwrap(), buffer)
79    }
80
81    /// for debug
82    fn deserialize(buffer: &[u8]) -> Result<Vec<(String, String)>, Error> {
83        let mut offset = 0;
84        let key_num = u64::from_le_bytes(buffer[offset..offset + 8].try_into().unwrap());
85        offset += 8;
86        let mut ordered_list = Vec::new();
87
88        offset += 8 * key_num as usize;
89
90        for _ in 0..key_num {
91            let key_size = u64::from_le_bytes(buffer[offset..offset + 8].try_into().unwrap());
92            offset += 8;
93
94            let key = String::from_utf8(buffer[offset..offset + key_size as usize].into()).unwrap();
95            offset += key_size as usize;
96
97            let value_size = u64::from_le_bytes(buffer[offset..offset + 8].try_into().unwrap());
98            offset += 8;
99
100            let value =
101                String::from_utf8(buffer[offset..offset + value_size as usize].into()).unwrap();
102            offset += value_size as usize;
103            ordered_list.push((key, value));
104        }
105        Ok(ordered_list)
106    }
107}
108
109// MemTable[#TODO] (should add some comments)
110impl Chunk {
111    pub(crate) fn get(&self, key: &[u8]) -> Result<Vec<u8>, Error> {
112        self.store.get(key)
113    }
114
115    pub(crate) fn delete(&mut self, key: &[u8]) -> Result<Vec<u8>, Error> {
116        match self.store.delete(key) {
117            Ok(removed) => {
118                self.key_nums -= 1;
119                self.used_size -= key.len() + removed.len();
120                Ok(removed)
121            }
122            Err(_) => todo!(),
123        }
124    }
125    pub(crate) fn insert(&mut self, key: &[u8], value: &[u8]) -> Result<(), Error> {
126        self.used_size += key.len() + value.len();
127        self.key_nums += 1;
128        self.store.insert(key, value)
129    }
130
131    pub(crate) fn is_overflowed(&self, size: usize) -> bool {
132        self.used_size + size >= self.total_size
133    }
134}
135
136#[cfg(test)]
137mod tests {
138    use super::*;
139
140    #[test]
141    fn test_chunk_new() {
142        let chunk = Chunk::new();
143
144        // Add assertions here to validate the initialization of the chunk
145        // For example:
146        assert_eq!(chunk.total_size, DEFAULT_MAX_CHUNK_SIZE);
147        assert_eq!(chunk.used_size, 0);
148        assert_eq!(chunk.key_nums, 0);
149    }
150
151    #[test]
152    fn test_chunk_serialize() {
153        let mut chunk = Chunk::new();
154        let key1 = b"key1".to_vec();
155        let value1 = b"value1".to_vec();
156        let key2 = b"key2".to_vec();
157        let value2 = b"value2".to_vec();
158
159        chunk.insert(&key1, &value1).unwrap();
160        chunk.insert(&key2, &value2).unwrap();
161        let key_nums = chunk.key_nums;
162        let used_size = chunk.used_size;
163
164        let (first_key, buffer) = chunk.serialize();
165
166        let expected_buffer_length = key_nums * (8 + 8 + 8) + 8 + used_size;
167        // Add assertions here to validate the serialization result
168        // For example:
169        assert_eq!(first_key, key1);
170        assert_eq!(buffer.len(), expected_buffer_length);
171    }
172
173    #[test]
174    fn test_chunk_deserialize() {
175        let mut chunk = Chunk::new();
176        let key1 = b"key1".to_vec();
177        let value1 = b"value1".to_vec();
178        let key2 = b"key2".to_vec();
179        let value2 = b"value2".to_vec();
180        chunk.insert(&key1, &value1).unwrap();
181        chunk.insert(&key2, &value2).unwrap();
182
183        // Add code here to populate the buffer with serialized data
184
185        let (_, buffer) = chunk.serialize();
186        let ordered_list = Chunk::deserialize(&buffer).unwrap();
187
188        // Add assertions here to validate the deserialization result
189        // For example:
190
191        assert_eq!(ordered_list.len(), 2);
192        assert_eq!(ordered_list[0], ("key1".to_string(), "value1".to_string()));
193        assert_eq!(ordered_list[1], ("key2".to_string(), "value2".to_string()));
194    }
195
196    #[test]
197    fn test_chunk_get() {
198        let mut chunk = Chunk::new();
199        let key1 = b"key1".to_vec();
200        let value1 = b"value1".to_vec();
201        let key2 = b"key2".to_vec();
202        let value2 = b"value2".to_vec();
203
204        chunk.insert(&key1, &value1).unwrap();
205        chunk.insert(&key2, &value2).unwrap();
206
207        let retrieved_value1 = chunk.get(&key1).unwrap();
208        let retrieved_value2 = chunk.get(&key2).unwrap();
209
210        // Add assertions here to validate the retrieved values
211        // For example:
212        assert_eq!(retrieved_value1, value1);
213        assert_eq!(retrieved_value2, value2);
214    }
215
216    #[test]
217    fn test_chunk_delete() {
218        let mut chunk = Chunk::new();
219        let key1 = b"key1".to_vec();
220        let value1 = b"value1".to_vec();
221
222        chunk.insert(&key1, &value1).unwrap();
223
224        let removed_value = chunk.delete(&key1).unwrap();
225
226        // Add assertions here to validate the removed value
227        // For example:
228        assert_eq!(removed_value, value1);
229    }
230
231    // Add more unit tests as needed
232}