提交 78fee9ee 编写于 作者: Z ZhaoMing 提交者: 奏之章

Fix BuildInheritanceTree bug

上级 94ac0b8d
......@@ -132,37 +132,41 @@ Status BuildInheritanceTree(const std::vector<CompactionInputFiles>& inputs,
return s;
}
inheritance_tree->emplace_back(f->fd.GetNumber());
// 1. verify input inheritance tree
// 2. purge unnecessary node
// 3. merge input inheritance tree
// verify input inheritance tree
size_t size = inheritance_tree->size();
size_t count = 0;
for (auto file_number : tp->inheritance_tree) {
if (inheritance_tree->back() != file_number) {
inheritance_tree->emplace_back(file_number);
} else if (dependence_map.count(file_number) != 0) {
++count;
inheritance_tree->emplace_back(file_number);
} else {
++pruge_count;
for (auto fn : tp->inheritance_tree) {
if (inheritance_tree->back() == fn) {
inheritance_tree->pop_back();
if (inheritance_tree->size() < size) {
break;
}
} else {
inheritance_tree->emplace_back(fn);
}
}
if (size + count * 2 != inheritance_tree->size()) {
if (inheritance_tree->size() != size) {
// input inheritance tree invalid !
return Status::Corruption(
"BuildInheritanceTree: bad inheritance_tree, file_number ",
ToString(f->fd.GetNumber()));
}
// purge unnecessary node & merge input inheritance tree
for (auto fn : tp->inheritance_tree) {
if (inheritance_tree->back() == fn && dependence_map.count(fn) == 0) {
++pruge_count;
inheritance_tree->pop_back();
} else {
inheritance_tree->emplace_back(fn);
}
}
inheritance_tree->emplace_back(f->fd.GetNumber());
}
}
if (pruge_count_ptr != nullptr) {
*pruge_count_ptr = pruge_count;
}
inheritance_tree->shrink_to_fit();
return s;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册