make mvcc impl compile with new key module

Signed-off-by: Alex Chi <iskyzh@gmail.com>
This commit is contained in:
Alex Chi
2024-01-25 12:27:16 +08:00
committed by Alex Chi Z
parent 753e6d4f9e
commit 971d0b1c81
11 changed files with 96 additions and 62 deletions

View File

@@ -19,10 +19,10 @@ pub struct BlockBuilder {
fn compute_overlap(first_key: KeySlice, key: KeySlice) -> usize {
let mut i = 0;
loop {
if i >= first_key.len() || i >= key.len() {
if i >= first_key.key_len() || i >= key.key_len() {
break;
}
if first_key.raw_ref()[i] != key.raw_ref()[i] {
if first_key.key_ref()[i] != key.key_ref()[i] {
break;
}
i += 1;
@@ -50,7 +50,7 @@ impl BlockBuilder {
#[must_use]
pub fn add(&mut self, key: KeySlice, value: &[u8]) -> bool {
assert!(!key.is_empty(), "key must not be empty");
if self.estimated_size() + key.len() + value.len() + SIZEOF_U16 * 3 /* key_len, value_len and offset */ > self.block_size
if self.estimated_size() + key.raw_len() + value.len() + SIZEOF_U16 * 3 /* key_len, value_len and offset */ > self.block_size
&& !self.is_empty()
{
return false;
@@ -61,9 +61,11 @@ impl BlockBuilder {
// Encode key overlap.
self.data.put_u16(overlap as u16);
// Encode key length.
self.data.put_u16((key.len() - overlap) as u16);
self.data.put_u16((key.key_len() - overlap) as u16);
// Encode key content.
self.data.put(&key.raw_ref()[overlap..]);
self.data.put(&key.key_ref()[overlap..]);
// Encode key ts
self.data.put_u64(key.ts());
// Encode value length.
self.data.put_u16(value.len() as u16);
// Encode value content.

View File

@@ -27,9 +27,10 @@ impl Block {
fn get_first_key(&self) -> KeyVec {
let mut buf = &self.data[..];
buf.get_u16();
let key_len = buf.get_u16();
let key = &buf[..key_len as usize];
KeyVec::from_vec(key.to_vec())
let key_len = buf.get_u16() as usize;
let key = &buf[..key_len];
buf.advance(key_len);
KeyVec::from_vec_with_ts(key.to_vec(), buf.get_u64())
}
}
@@ -108,11 +109,15 @@ impl BlockIterator {
let key_len = entry.get_u16() as usize;
let key = &entry[..key_len];
self.key.clear();
self.key.append(&self.first_key.raw_ref()[..overlap_len]);
self.key.append(&self.first_key.key_ref()[..overlap_len]);
self.key.append(key);
entry.advance(key_len);
let ts = entry.get_u64();
self.key.set_ts(ts);
let value_len = entry.get_u16() as usize;
let value_offset_begin = offset + SIZEOF_U16 + SIZEOF_U16 + key_len + SIZEOF_U16;
// REMEMBER TO CHANGE THIS every time you change the encoding!
let value_offset_begin =
offset + SIZEOF_U16 + SIZEOF_U16 + std::mem::size_of::<u64>() + key_len + SIZEOF_U16;
let value_offset_end = value_offset_begin + value_len;
self.value_range = (value_offset_begin, value_offset_end);
entry.advance(value_len);