in common/rusty_leveldb_sgx/src/version_set.rs [1231:1338]
fn test_version_set_compaction() {
let (v, opt) = make_version();
let mut vs = VersionSet::new("db", opt.clone(), share(TableCache::new("db", opt, 100)));
vs.add_version(v);
{
// approximate_offset()
let v = vs.current();
assert_eq!(
0,
vs.approximate_offset(&v, LookupKey::new("aaa".as_bytes(), 9000).internal_key())
);
assert_eq!(
232,
vs.approximate_offset(&v, LookupKey::new("bab".as_bytes(), 9000).internal_key())
);
assert_eq!(
1134,
vs.approximate_offset(&v, LookupKey::new("fab".as_bytes(), 9000).internal_key())
);
}
// The following tests reuse the same version set and verify that various compactions work
// like they should.
{
// compact level 0 with a partial range.
let from = LookupKey::new("000".as_bytes(), 1000);
let to = LookupKey::new("ab".as_bytes(), 1010);
let c = vs
.compact_range(0, from.internal_key(), to.internal_key())
.unwrap();
assert_eq!(2, c.inputs[0].len());
assert_eq!(1, c.inputs[1].len());
assert_eq!(1, c.grandparents.unwrap().len());
// compact level 0, but entire range of keys in version.
let from = LookupKey::new("000".as_bytes(), 1000);
let to = LookupKey::new("zzz".as_bytes(), 1010);
let c = vs
.compact_range(0, from.internal_key(), to.internal_key())
.unwrap();
assert_eq!(2, c.inputs[0].len());
assert_eq!(1, c.inputs[1].len());
assert_eq!(1, c.grandparents.as_ref().unwrap().len());
iterator_properties(
vs.make_input_iterator(&c),
12,
Rc::new(Box::new(vs.cmp.clone())),
);
// Expand input range on higher level.
let from = LookupKey::new("dab".as_bytes(), 1000);
let to = LookupKey::new("eab".as_bytes(), 1010);
let c = vs
.compact_range(1, from.internal_key(), to.internal_key())
.unwrap();
assert_eq!(3, c.inputs[0].len());
assert_eq!(1, c.inputs[1].len());
assert_eq!(0, c.grandparents.as_ref().unwrap().len());
iterator_properties(
vs.make_input_iterator(&c),
12,
Rc::new(Box::new(vs.cmp.clone())),
);
// is_trivial_move
let from = LookupKey::new("fab".as_bytes(), 1000);
let to = LookupKey::new("fba".as_bytes(), 1010);
let mut c = vs
.compact_range(2, from.internal_key(), to.internal_key())
.unwrap();
// pretend it's not manual
c.manual = false;
assert!(c.is_trivial_move());
// should_stop_before
let from = LookupKey::new("000".as_bytes(), 1000);
let to = LookupKey::new("zzz".as_bytes(), 1010);
let mid = LookupKey::new("abc".as_bytes(), 1010);
let mut c = vs
.compact_range(0, from.internal_key(), to.internal_key())
.unwrap();
assert!(!c.should_stop_before(from.internal_key()));
assert!(!c.should_stop_before(mid.internal_key()));
assert!(!c.should_stop_before(to.internal_key()));
// is_base_level_for
let from = LookupKey::new("000".as_bytes(), 1000);
let to = LookupKey::new("zzz".as_bytes(), 1010);
let mut c = vs
.compact_range(0, from.internal_key(), to.internal_key())
.unwrap();
assert!(c.is_base_level_for("aaa".as_bytes()));
assert!(!c.is_base_level_for("hac".as_bytes()));
// input/add_input_deletions
let from = LookupKey::new("000".as_bytes(), 1000);
let to = LookupKey::new("zzz".as_bytes(), 1010);
let mut c = vs
.compact_range(0, from.internal_key(), to.internal_key())
.unwrap();
for inp in &[(0, 0, 1), (0, 1, 2), (1, 0, 3)] {
let f = &c.inputs[inp.0][inp.1];
assert_eq!(inp.2, f.borrow().num);
}
c.add_input_deletions();
assert_eq!(23, c.edit().encode().len())
}
}