Skip to content

Commit a1c05b4

Browse files
committed
add secret slice method
1 parent be41dc2 commit a1c05b4

File tree

4 files changed

+41
-25
lines changed

4 files changed

+41
-25
lines changed

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
name = "value-log"
33
description = "Value log implementation for key-value separated LSM storage"
44
license = "MIT OR Apache-2.0"
5-
version = "1.1.1"
5+
version = "1.2.0"
66
edition = "2021"
77
rust-version = "1.74.0"
88
readme = "README.md"
@@ -27,7 +27,7 @@ min-max-heap = "1.3.0"
2727
path-absolutize = "3.1.1"
2828
quick_cache = { version = "0.6.5", default-features = false }
2929
rustc-hash = "2.0.0"
30-
serde = { version = "1.0.204", optional = true, features = ["derive"] }
30+
serde = { version = "1.0.215", optional = true, features = ["derive"] }
3131
tempfile = "3.12.0"
3232
xxhash-rust = { version = "0.8.12", features = ["xxh3"] }
3333

src/key_range.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,10 @@ impl Encode for KeyRange {
5353
impl Decode for KeyRange {
5454
fn decode_from<R: Read>(reader: &mut R) -> Result<Self, DecodeError> {
5555
let key_min_len = reader.read_u16::<BigEndian>()?;
56-
let mut key_min = vec![0; key_min_len.into()];
57-
reader.read_exact(&mut key_min)?;
58-
let key_min: UserKey = Slice::from(key_min);
56+
let key_min: UserKey = Slice::from_reader(reader, key_min_len.into())?;
5957

6058
let key_max_len = reader.read_u16::<BigEndian>()?;
61-
let mut key_max = vec![0; key_max_len.into()];
62-
reader.read_exact(&mut key_max)?;
63-
let key_max: UserKey = Slice::from(key_max);
59+
let key_max: UserKey = Slice::from_reader(reader, key_max_len.into())?;
6460

6561
Ok(Self::new((key_min, key_max)))
6662
}

src/slice.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,22 @@ impl Slice {
1515
pub fn new(bytes: &[u8]) -> Self {
1616
Self::from(bytes)
1717
}
18+
19+
#[must_use]
20+
#[doc(hidden)]
21+
pub fn with_size(len: usize) -> Self {
22+
// TODO: optimize this with byteview to remove the reallocation
23+
let v = vec![0; len];
24+
Self(v.into())
25+
}
26+
27+
#[doc(hidden)]
28+
pub fn from_reader<R: std::io::Read>(reader: &mut R, len: usize) -> std::io::Result<Self> {
29+
let mut view = Self::with_size(len);
30+
let builder = Arc::get_mut(&mut view.0).expect("we are the owner");
31+
reader.read_exact(builder)?;
32+
Ok(view)
33+
}
1834
}
1935

2036
impl std::borrow::Borrow<[u8]> for Slice {

tests/basic_kv.rs

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,30 +23,34 @@ fn basic_kv() -> value_log::Result<()> {
2323

2424
let index = MockIndex::default();
2525

26-
let value_log = ValueLog::open(vl_path, Config::<NoCompressor>::default())?;
27-
2826
let items = ["a", "b", "c", "d", "e"];
2927

3028
{
31-
let mut index_writer = MockIndexWriter(index.clone());
32-
let mut writer = value_log.get_writer()?;
29+
let value_log = ValueLog::open(vl_path, Config::<NoCompressor>::default())?;
3330

34-
for key in &items {
35-
let value = key.repeat(10_000);
36-
let value = value.as_bytes();
31+
{
32+
let mut index_writer = MockIndexWriter(index.clone());
33+
let mut writer = value_log.get_writer()?;
3734

38-
let key = key.as_bytes();
35+
for key in &items {
36+
let value = key.repeat(10_000);
37+
let value = value.as_bytes();
3938

40-
let vhandle = writer.get_next_value_handle();
41-
index_writer.insert_indirect(key, vhandle, value.len() as u32)?;
39+
let key = key.as_bytes();
4240

43-
writer.write(key, value)?;
44-
}
41+
let vhandle = writer.get_next_value_handle();
42+
index_writer.insert_indirect(key, vhandle, value.len() as u32)?;
4543

46-
value_log.register_writer(writer)?;
44+
writer.write(key, value)?;
45+
}
46+
47+
value_log.register_writer(writer)?;
48+
}
4749
}
4850

4951
{
52+
let value_log = ValueLog::open(vl_path, Config::<NoCompressor>::default())?;
53+
5054
assert_eq!(1, value_log.segment_count());
5155

5256
let segments = value_log.manifest.list_segments();
@@ -65,11 +69,11 @@ fn basic_kv() -> value_log::Result<()> {
6569
segment.len(),
6670
segment.scan().into_iter().flatten().count() as u64
6771
);
68-
}
6972

70-
for (key, (vhandle, _)) in index.read().unwrap().iter() {
71-
let item = value_log.get(vhandle)?.unwrap();
72-
assert_eq!(&*item, &*key.repeat(10_000));
73+
for (key, (vhandle, _)) in index.read().unwrap().iter() {
74+
let item = value_log.get(vhandle)?.unwrap();
75+
assert_eq!(&*item, &*key.repeat(10_000));
76+
}
7377
}
7478

7579
Ok(())

0 commit comments

Comments
 (0)