docs: add comments & hints for day one starter and reference code (#18)

* feat(docs): Improve/Add comments & some hints for day one starter code

* feat(docs): Add comments for day one solution code

* feat(docs): Add figure for block storage format in starter code (block.rs)
This commit is contained in:
Xu
2023-07-11 12:05:34 +08:00
committed by GitHub
parent e13ce4f5ff
commit de7f2ec263
5 changed files with 27 additions and 3 deletions

View File

@@ -21,6 +21,7 @@ impl Block {
for offset in &self.offsets {
buf.put_u16(*offset);
}
// Adds number of elements at the end of the block
buf.put_u16(offsets_len as u16);
buf.into()
}

View File

@@ -30,11 +30,13 @@ impl BlockBuilder {
#[must_use]
pub fn add(&mut self, key: &[u8], value: &[u8]) -> bool {
assert!(!key.is_empty(), "key must not be empty");
// The overhead here is `key_len` + `val_len` + `offset`, each is of type `u16`
if self.estimated_size() + key.len() + value.len() + SIZEOF_U16 * 3 > self.block_size
&& !self.is_empty()
{
return false;
}
// The offsets should be updated at first, to maintain the correct offset
self.offsets.push(self.data.len() as u16);
self.data.put_u16(key.len() as u16);
self.data.put(key);

View File

@@ -76,8 +76,12 @@ impl BlockIterator {
self.seek_to(self.idx);
}
/// Seek to the specified position and update the current `key` and `value`
/// Index update will be handled by caller
fn seek_to_offset(&mut self, offset: usize) {
let mut entry = &self.block.data[offset..];
// Since `get_u16()` will automatically move the ptr 2 bytes ahead here,
// we don't need to manually advance it
let key_len = entry.get_u16() as usize;
let key = entry[..key_len].to_vec();
entry.advance(key_len);
@@ -90,7 +94,7 @@ impl BlockIterator {
self.value.extend(value);
}
/// Seek to the first key that >= `key`.
/// Seek to the first key that is >= `key`.
pub fn seek_to_key(&mut self, key: &[u8]) {
let mut low = 0;
let mut high = self.block.offsets.len();