From: Yingxin Cheng Date: Wed, 23 Dec 2020 03:03:50 +0000 (+0800) Subject: crimson/onode-staged-tree: validate insertion in a separate transaction X-Git-Tag: v16.1.0~63^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4f5747d87f5e23a0700bfcec7c9064f65dd7c741;p=ceph.git crimson/onode-staged-tree: validate insertion in a separate transaction Signed-off-by: Yingxin Cheng --- diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/tree_utils.h b/src/crimson/os/seastore/onode_manager/staged-fltree/tree_utils.h index fb61abef3543..4bbcd97b7a1f 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/tree_utils.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/tree_utils.h @@ -294,6 +294,26 @@ class TreeBuilder { }); } + future<> validate(Transaction& t) { + logger().info("Verifing insertion ..."); + return seastar::do_with( + kvs.begin(), [&t, this] (auto& kvs_iter) { + return crimson::do_until([&t, this, &kvs_iter]() -> future { + if (kvs_iter.is_end()) { + logger().info("Verify done!"); + return ertr::make_ready_future(true); + } + auto [k, v] = kvs_iter.get_kv(); + return tree.lower_bound(t, k + ).safe_then([&kvs_iter, k=k, v=v] (auto cursor) { + Onodes::validate_cursor(cursor, k, *v); + ++kvs_iter; + return ertr::make_ready_future(false); + }); + }); + }); + } + private: static seastar::logger& logger() { return crimson::get_logger(ceph_subsys_filestore); diff --git a/src/test/crimson/seastore/onode_tree/test_staged_fltree.cc b/src/test/crimson/seastore/onode_tree/test_staged_fltree.cc index 52f488f8b49a..bcc1c909da8c 100644 --- a/src/test/crimson/seastore/onode_tree/test_staged_fltree.cc +++ b/src/test/crimson/seastore/onode_tree/test_staged_fltree.cc @@ -1191,6 +1191,11 @@ TEST_F(d_seastore_tm_test_t, 6_random_insert_leaf_node) tree->get_stats(*t).unsafe_get(); tm->submit_transaction(std::move(t)).unsafe_get(); } + { + // Note: tm->create_weak_transaction() can also work, but too slow. + auto t = tm->create_transaction(); + tree->validate(*t).unsafe_get(); + } tree.reset(); }); } diff --git a/src/tools/crimson/perf_staged_fltree.cc b/src/tools/crimson/perf_staged_fltree.cc index 2e9315e9d385..b8d16f6c45b9 100644 --- a/src/tools/crimson/perf_staged_fltree.cc +++ b/src/tools/crimson/perf_staged_fltree.cc @@ -47,6 +47,11 @@ class PerfTree : public TMTestState { tree->get_stats(*t).unsafe_get(); tm->submit_transaction(std::move(t)).unsafe_get(); } + { + // Note: tm->create_weak_transaction() can also work, but too slow. + auto t = tm->create_transaction(); + tree->validate(*t).unsafe_get(); + } tree.reset(); }); }).then([this] {