in common/rusty_leveldb_sgx/src/version_set.rs [370:452]
fn setup_other_inputs(&mut self, compaction: &mut Compaction) {
assert!(self.current.is_some());
let current = self.current.as_ref().unwrap();
let current = current.borrow();
let level = compaction.level;
let (mut smallest, mut largest) = get_range(&self.cmp, compaction.inputs[0].iter());
// Set up level+1 inputs.
compaction.inputs[1] = current.overlapping_inputs(level + 1, &smallest, &largest);
let (mut allstart, mut alllimit) = get_range(
&self.cmp,
compaction.inputs[0]
.iter()
.chain(compaction.inputs[1].iter()),
);
// Check if we can add more inputs in the current level without having to compact more
// inputs from level+1.
if !compaction.inputs[1].is_empty() {
let expanded0 = current.overlapping_inputs(level, &allstart, &alllimit);
let inputs1_size = total_size(compaction.inputs[1].iter());
let expanded0_size = total_size(expanded0.iter());
// ...if we picked up more files in the current level, and the total size is acceptable
if expanded0.len() > compaction.num_inputs(0)
&& (inputs1_size + expanded0_size) < 25 * self.opt.max_file_size
{
let (new_start, new_limit) = get_range(&self.cmp, expanded0.iter());
let expanded1 = current.overlapping_inputs(level + 1, &new_start, &new_limit);
if expanded1.len() == compaction.num_inputs(1) {
log!(
self.opt.log,
"Expanding inputs@{} {}+{} ({}+{} bytes) to {}+{} ({}+{} bytes)",
level,
compaction.inputs[0].len(),
compaction.inputs[1].len(),
total_size(compaction.inputs[0].iter()),
total_size(compaction.inputs[1].iter()),
expanded0.len(),
expanded1.len(),
total_size(expanded0.iter()),
total_size(expanded1.iter())
);
smallest = new_start;
largest = new_limit;
compaction.inputs[0] = expanded0;
compaction.inputs[1] = expanded1;
let (newallstart, newalllimit) = get_range(
&self.cmp,
compaction.inputs[0]
.iter()
.chain(compaction.inputs[1].iter()),
);
allstart = newallstart;
alllimit = newalllimit;
}
}
}
// Set the list of grandparent (l+2) inputs to the files overlapped by the current overall
// range.
if level + 2 < NUM_LEVELS {
let grandparents = self.current.as_ref().unwrap().borrow().overlapping_inputs(
level + 2,
&allstart,
&alllimit,
);
compaction.grandparents = Some(grandparents);
}
log!(
self.opt.log,
"Compacting @{} {:?} .. {:?}",
level,
smallest,
largest
);
compaction.edit().set_compact_pointer(level, &largest);
self.compaction_ptrs[level] = largest;
}