]>
Commit | Line | Data |
---|---|---|
f67539c2 TL |
1 | // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:nil -*- |
2 | // vim: ts=8 sw=2 smarttab | |
3 | ||
4 | #include <boost/program_options.hpp> | |
5 | ||
6 | #include <seastar/core/app-template.hh> | |
7 | #include <seastar/core/thread.hh> | |
8 | ||
9 | #include "crimson/common/log.h" | |
10 | #include "crimson/os/seastore/onode_manager/staged-fltree/tree_utils.h" | |
11 | #include "crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager.h" | |
12 | #include "test/crimson/seastore/transaction_manager_test_state.h" | |
13 | ||
14 | using namespace crimson::os::seastore::onode; | |
15 | namespace bpo = boost::program_options; | |
16 | ||
17 | seastar::logger& logger() { | |
18 | return crimson::get_logger(ceph_subsys_test); | |
19 | } | |
20 | ||
21 | template <bool TRACK> | |
22 | class PerfTree : public TMTestState { | |
23 | public: | |
24 | PerfTree(bool is_dummy) : is_dummy{is_dummy} {} | |
25 | ||
26 | seastar::future<> run(KVPool& kvs) { | |
27 | return tm_setup().then([this, &kvs] { | |
28 | return seastar::async([this, &kvs] { | |
29 | auto tree = std::make_unique<TreeBuilder<TRACK>>(kvs, | |
30 | (is_dummy ? NodeExtentManager::create_dummy(true) | |
31 | : NodeExtentManager::create_seastore(*tm))); | |
32 | { | |
33 | auto t = tm->create_transaction(); | |
34 | tree->bootstrap(*t).unsafe_get(); | |
35 | tm->submit_transaction(std::move(t)).unsafe_get(); | |
36 | } | |
37 | { | |
38 | auto t = tm->create_transaction(); | |
39 | tree->insert(*t).unsafe_get(); | |
40 | auto start_time = mono_clock::now(); | |
41 | tm->submit_transaction(std::move(t)).unsafe_get(); | |
42 | std::chrono::duration<double> duration = mono_clock::now() - start_time; | |
43 | logger().warn("submit_transaction() done! {}s", duration.count()); | |
44 | } | |
45 | { | |
46 | auto t = tm->create_transaction(); | |
47 | tree->get_stats(*t).unsafe_get(); | |
48 | tm->submit_transaction(std::move(t)).unsafe_get(); | |
49 | } | |
50 | { | |
51 | // Note: tm->create_weak_transaction() can also work, but too slow. | |
52 | auto t = tm->create_transaction(); | |
53 | tree->validate(*t).unsafe_get(); | |
54 | } | |
55 | tree.reset(); | |
56 | }); | |
57 | }).then([this] { | |
58 | return tm_teardown(); | |
59 | }); | |
60 | } | |
61 | ||
62 | private: | |
63 | bool is_dummy; | |
64 | }; | |
65 | ||
66 | template <bool TRACK> | |
67 | seastar::future<> run(const bpo::variables_map& config) { | |
68 | return seastar::async([&config] { | |
69 | auto backend = config["backend"].as<std::string>(); | |
70 | bool is_dummy; | |
71 | if (backend == "dummy") { | |
72 | is_dummy = true; | |
73 | } else if (backend == "seastore") { | |
74 | is_dummy = false; | |
75 | } else { | |
76 | ceph_abort(false && "invalid backend"); | |
77 | } | |
78 | auto str_sizes = config["str-sizes"].as<std::vector<size_t>>(); | |
79 | auto onode_sizes = config["onode-sizes"].as<std::vector<size_t>>(); | |
80 | auto range2 = config["range2"].as<std::vector<int>>(); | |
81 | ceph_assert(range2.size() == 2); | |
82 | auto range1 = config["range1"].as<std::vector<unsigned>>(); | |
83 | ceph_assert(range1.size() == 2); | |
84 | auto range0 = config["range0"].as<std::vector<unsigned>>(); | |
85 | ceph_assert(range0.size() == 2); | |
86 | ||
87 | KVPool kvs{str_sizes, onode_sizes, | |
88 | {range2[0], range2[1]}, | |
89 | {range1[0], range1[1]}, | |
90 | {range0[0], range0[1]}}; | |
91 | PerfTree<TRACK> perf{is_dummy}; | |
92 | perf.run(kvs).get0(); | |
93 | }); | |
94 | } | |
95 | ||
96 | ||
97 | int main(int argc, char** argv) | |
98 | { | |
99 | seastar::app_template app; | |
100 | app.add_options() | |
101 | ("backend", bpo::value<std::string>()->default_value("dummy"), | |
102 | "tree backend: dummy, seastore") | |
103 | ("tracked", bpo::value<bool>()->default_value(false), | |
104 | "track inserted cursors") | |
105 | ("str-sizes", bpo::value<std::vector<size_t>>()->default_value( | |
106 | {8, 11, 64, 256, 301, 320}), | |
107 | "sizes of ns/oid strings") | |
108 | ("onode-sizes", bpo::value<std::vector<size_t>>()->default_value( | |
109 | {8, 16, 128, 512, 576, 640}), | |
110 | "sizes of onode") | |
111 | ("range2", bpo::value<std::vector<int>>()->default_value( | |
112 | {0, 128}), | |
113 | "range of shard-pool-crush [a, b)") | |
114 | ("range1", bpo::value<std::vector<unsigned>>()->default_value( | |
115 | {0, 10}), | |
116 | "range of ns-oid strings [a, b)") | |
117 | ("range0", bpo::value<std::vector<unsigned>>()->default_value( | |
118 | {0, 4}), | |
119 | "range of snap-gen [a, b)"); | |
120 | return app.run(argc, argv, [&app] { | |
121 | auto&& config = app.configuration(); | |
122 | auto tracked = config["tracked"].as<bool>(); | |
123 | if (tracked) { | |
124 | return run<true>(config); | |
125 | } else { | |
126 | return run<false>(config); | |
127 | } | |
128 | }); | |
129 | } |