]> git.proxmox.com Git - ceph.git/blame - ceph/src/tools/crimson/perf_staged_fltree.cc
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / tools / crimson / perf_staged_fltree.cc
CommitLineData
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
14using namespace crimson::os::seastore::onode;
15namespace bpo = boost::program_options;
16
17seastar::logger& logger() {
18 return crimson::get_logger(ceph_subsys_test);
19}
20
21template <bool TRACK>
22class 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
66template <bool TRACK>
67seastar::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
97int 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}