Skip to content

Commit ac81380

Browse files
committed
add more test cases
1 parent 472a6a9 commit ac81380

File tree

3 files changed

+123
-2
lines changed

3 files changed

+123
-2
lines changed

src/manifest.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ impl<C: Compressor + Clone> SegmentManifest<C> {
6666
for dirent in std::fs::read_dir(folder)? {
6767
let dirent = dirent?;
6868

69-
if dirent.file_type()?.is_dir() {
69+
if dirent.file_type()?.is_file() {
7070
let segment_id = dirent
7171
.file_name()
7272
.to_str()
@@ -76,7 +76,7 @@ impl<C: Compressor + Clone> SegmentManifest<C> {
7676

7777
if !registered_ids.contains(&segment_id) {
7878
log::trace!("Deleting unfinished vLog segment {segment_id}");
79-
std::fs::remove_dir_all(dirent.path())?;
79+
std::fs::remove_file(dirent.path())?;
8080
}
8181
}
8282
}

tests/recovery_delete_unfinished.rs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
use test_log::test;
2+
use value_log::{Compressor, Config, IndexWriter, MockIndex, MockIndexWriter, ValueLog};
3+
4+
#[derive(Clone, Default)]
5+
struct NoCompressor;
6+
7+
impl Compressor for NoCompressor {
8+
fn compress(&self, bytes: &[u8]) -> value_log::Result<Vec<u8>> {
9+
Ok(bytes.into())
10+
}
11+
12+
fn decompress(&self, bytes: &[u8]) -> value_log::Result<Vec<u8>> {
13+
Ok(bytes.into())
14+
}
15+
}
16+
17+
#[test]
18+
fn recovery_delete_unfinished() -> value_log::Result<()> {
19+
let folder = tempfile::tempdir()?;
20+
let vl_path = folder.path();
21+
22+
let index = MockIndex::default();
23+
24+
let items = ["a", "b", "c", "d", "e"];
25+
26+
{
27+
let value_log = ValueLog::open(vl_path, Config::<NoCompressor>::default())?;
28+
29+
{
30+
let mut index_writer = MockIndexWriter(index.clone());
31+
let mut writer = value_log.get_writer()?;
32+
33+
for key in &items {
34+
let value = key.repeat(10_000);
35+
let value = value.as_bytes();
36+
37+
let key = key.as_bytes();
38+
39+
let vhandle = writer.get_next_value_handle();
40+
index_writer.insert_indirect(key, vhandle, value.len() as u32)?;
41+
42+
writer.write(key, value)?;
43+
}
44+
45+
value_log.register_writer(writer)?;
46+
}
47+
}
48+
49+
let faux_segment = vl_path.join("segments").join("5");
50+
{
51+
std::fs::File::create(&faux_segment)?;
52+
}
53+
54+
{
55+
let value_log = ValueLog::open(vl_path, Config::<NoCompressor>::default())?;
56+
assert_eq!(1, value_log.segment_count());
57+
}
58+
59+
assert!(!faux_segment.try_exists()?);
60+
61+
Ok(())
62+
}

tests/recovery_mac_ds_store.rs

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
use test_log::test;
2+
use value_log::{Compressor, Config, IndexWriter, MockIndex, MockIndexWriter, ValueLog};
3+
4+
#[derive(Clone, Default)]
5+
struct NoCompressor;
6+
7+
impl Compressor for NoCompressor {
8+
fn compress(&self, bytes: &[u8]) -> value_log::Result<Vec<u8>> {
9+
Ok(bytes.into())
10+
}
11+
12+
fn decompress(&self, bytes: &[u8]) -> value_log::Result<Vec<u8>> {
13+
Ok(bytes.into())
14+
}
15+
}
16+
17+
#[test]
18+
fn recovery_mac_ds_store() -> value_log::Result<()> {
19+
let folder = tempfile::tempdir()?;
20+
let vl_path = folder.path();
21+
22+
let index = MockIndex::default();
23+
24+
let items = ["a", "b", "c", "d", "e"];
25+
26+
{
27+
let value_log = ValueLog::open(vl_path, Config::<NoCompressor>::default())?;
28+
29+
{
30+
let mut index_writer = MockIndexWriter(index.clone());
31+
let mut writer = value_log.get_writer()?;
32+
33+
for key in &items {
34+
let value = key.repeat(10_000);
35+
let value = value.as_bytes();
36+
37+
let key = key.as_bytes();
38+
39+
let vhandle = writer.get_next_value_handle();
40+
index_writer.insert_indirect(key, vhandle, value.len() as u32)?;
41+
42+
writer.write(key, value)?;
43+
}
44+
45+
value_log.register_writer(writer)?;
46+
}
47+
}
48+
49+
{
50+
std::fs::File::create(vl_path.join("segments").join(".DS_Store"))?;
51+
}
52+
53+
{
54+
let value_log = ValueLog::open(vl_path, Config::<NoCompressor>::default())?;
55+
assert_eq!(1, value_log.segment_count());
56+
}
57+
58+
Ok(())
59+
}

0 commit comments

Comments
 (0)