[unit-tests] Add underfull nodes counting tests
This commit is contained in:
parent
61f07573e1
commit
c932a76f08
@ -28,11 +28,21 @@ namespace {
|
|||||||
tm_(bm_, sm_) {
|
tm_(bm_, sm_) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void check_nr_metadata_blocks_is_ge(unsigned n) {
|
size_t get_nr_metadata_blocks(bool ignore_non_fatal = false,
|
||||||
block_counter bc;
|
bool stop_on_error = false) {
|
||||||
|
block_counter bc(stop_on_error);
|
||||||
noop_value_counter<uint64_t> vc;
|
noop_value_counter<uint64_t> vc;
|
||||||
count_btree_blocks(*tree_, bc, vc);
|
count_btree_blocks(*tree_, bc, vc, ignore_non_fatal);
|
||||||
ASSERT_THAT(bc.get_counts().size(), Ge(n));
|
return bc.get_counts().size();
|
||||||
|
}
|
||||||
|
|
||||||
|
void damage_first_leaf_underfull() {
|
||||||
|
bcache::validator::ptr v = create_btree_node_validator();
|
||||||
|
|
||||||
|
block_address b = get_first_leaf();
|
||||||
|
block_manager::write_ref blk = bm_->write_lock(b, v);
|
||||||
|
btree<1, uint64_traits>::leaf_node n = to_node<uint64_traits>(blk);
|
||||||
|
n.set_nr_entries(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
with_temp_directory dir_;
|
with_temp_directory dir_;
|
||||||
@ -53,6 +63,19 @@ namespace {
|
|||||||
void commit() {
|
void commit() {
|
||||||
block_manager::write_ref superblock(bm_->superblock(SUPERBLOCK));
|
block_manager::write_ref superblock(bm_->superblock(SUPERBLOCK));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
block_address get_first_leaf() {
|
||||||
|
bcache::validator::ptr v = create_btree_node_validator();
|
||||||
|
|
||||||
|
block_manager::read_ref root = bm_->read_lock(tree_->get_root(), v);
|
||||||
|
btree<1, uint64_traits>::internal_node n = to_node<block_traits>(root);
|
||||||
|
while (n.get_type() == INTERNAL) {
|
||||||
|
block_manager::read_ref internal = bm_->read_lock(n.value_at(0), v);
|
||||||
|
n = to_node<block_traits>(internal);
|
||||||
|
}
|
||||||
|
|
||||||
|
return n.get_block_nr();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -62,7 +85,7 @@ TEST_F(BTreeCounterTests, count_empty_tree)
|
|||||||
{
|
{
|
||||||
tree_.reset(new btree<1, uint64_traits>(tm_, rc_));
|
tree_.reset(new btree<1, uint64_traits>(tm_, rc_));
|
||||||
tm_.get_bm()->flush();
|
tm_.get_bm()->flush();
|
||||||
check_nr_metadata_blocks_is_ge(1);
|
ASSERT_GE(get_nr_metadata_blocks(), 1u);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(BTreeCounterTests, count_populated_tree)
|
TEST_F(BTreeCounterTests, count_populated_tree)
|
||||||
@ -75,7 +98,44 @@ TEST_F(BTreeCounterTests, count_populated_tree)
|
|||||||
}
|
}
|
||||||
|
|
||||||
tm_.get_bm()->flush();
|
tm_.get_bm()->flush();
|
||||||
check_nr_metadata_blocks_is_ge(40);
|
ASSERT_GE(get_nr_metadata_blocks(), 40u);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(BTreeCounterTests, count_underfull_nodes)
|
||||||
|
{
|
||||||
|
tree_.reset(new btree<1, uint64_traits>(tm_, rc_));
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < 10000; i++) {
|
||||||
|
uint64_t key[1] = {i};
|
||||||
|
tree_->insert(key, 0ull);
|
||||||
|
}
|
||||||
|
|
||||||
|
tm_.get_bm()->flush();
|
||||||
|
size_t nr_blocks = get_nr_metadata_blocks();
|
||||||
|
|
||||||
|
damage_first_leaf_underfull();
|
||||||
|
tm_.get_bm()->flush();
|
||||||
|
|
||||||
|
// underfull nodes are not counted
|
||||||
|
bool ignore_non_fatal = false;
|
||||||
|
bool stop_on_error = false;
|
||||||
|
ASSERT_EQ(get_nr_metadata_blocks(ignore_non_fatal, stop_on_error), nr_blocks - 1);
|
||||||
|
|
||||||
|
// underfull nodes are counted
|
||||||
|
ignore_non_fatal = true;
|
||||||
|
stop_on_error = false;
|
||||||
|
ASSERT_EQ(get_nr_metadata_blocks(ignore_non_fatal, stop_on_error), nr_blocks);
|
||||||
|
|
||||||
|
// logical errors like underfull nodes don't result in exceptions,
|
||||||
|
// therefore the stop_on_error flag has no effect.
|
||||||
|
// FIXME: is it necessary to stop the counting on logical errors?
|
||||||
|
ignore_non_fatal = false;
|
||||||
|
stop_on_error = true;
|
||||||
|
ASSERT_EQ(get_nr_metadata_blocks(ignore_non_fatal, stop_on_error), nr_blocks - 1);
|
||||||
|
|
||||||
|
ignore_non_fatal = true;
|
||||||
|
stop_on_error = true;
|
||||||
|
ASSERT_EQ(get_nr_metadata_blocks(ignore_non_fatal, stop_on_error), nr_blocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------
|
//----------------------------------------------------------------
|
||||||
|
Loading…
Reference in New Issue
Block a user