in common/rusty_leveldb_sgx/src/version_set.rs [1090:1158]
fn test_version_set_log_and_apply() {
let (_, opt) = make_version();
let mut vs = VersionSet::new(
"db",
opt.clone(),
share(TableCache::new("db", opt.clone(), 100)),
);
assert_eq!(2, vs.new_file_number());
// Simulate NewDB
{
let mut ve = VersionEdit::new();
ve.set_comparator_name("leveldb.BytewiseComparator");
ve.set_log_num(10);
ve.set_next_file(20);
ve.set_last_seq(30);
// Write first manifest to be recovered from.
let manifest = manifest_file_name("db", 19);
let mffile = opt.env.open_writable_file(Path::new(&manifest)).unwrap();
let mut lw = LogWriter::new(mffile);
lw.add_record(&ve.encode()).unwrap();
lw.flush().unwrap();
set_current_file(&opt.env.as_ref(), "db", 19).unwrap();
}
// Recover from new state.
{
vs.recover().unwrap();
assert_eq!(10, vs.log_num);
assert_eq!(21, vs.next_file_num);
assert_eq!(30, vs.last_seq);
assert_eq!(0, vs.current.as_ref().unwrap().borrow().files[0].len());
assert_eq!(0, vs.current.as_ref().unwrap().borrow().files[1].len());
assert_eq!(35, vs.write_snapshot().unwrap());
}
// Simulate compaction by adding a file.
{
let mut ve = VersionEdit::new();
ve.set_log_num(11);
let mut fmd = FileMetaData::default();
fmd.num = 21;
fmd.size = 123;
fmd.smallest = LookupKey::new("abc".as_bytes(), 777)
.internal_key()
.to_vec();
fmd.largest = LookupKey::new("def".as_bytes(), 700)
.internal_key()
.to_vec();
ve.add_file(1, fmd);
vs.log_and_apply(ve).unwrap();
assert!(opt.env.exists(Path::new("db/CURRENT")).unwrap());
assert!(opt.env.exists(Path::new("db/MANIFEST-000019")).unwrap());
// next_file_num and last_seq are untouched by log_and_apply
assert_eq!(21, vs.new_file_number());
assert_eq!(22, vs.next_file_num);
assert_eq!(30, vs.last_seq);
// the following fields are touched by log_and_apply.
assert_eq!(11, vs.log_num);
// The previous "compaction" should have added one file to the first level in the
// current version.
assert_eq!(0, vs.current.as_ref().unwrap().borrow().files[0].len());
assert_eq!(1, vs.current.as_ref().unwrap().borrow().files[1].len());
assert_eq!(63, vs.write_snapshot().unwrap());
}
}