]> git.proxmox.com Git - ceph.git/blame - ceph/src/test/bench/bencher.h
bump version to 12.2.12-pve1
[ceph.git] / ceph / src / test / bench / bencher.h
CommitLineData
7c673cae
FG
1// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2
3#ifndef BENCHERH
4#define BENCHERH
5
6#include <utility>
7#include "distribution.h"
8#include "stat_collector.h"
9#include "backend.h"
10#include <boost/scoped_ptr.hpp>
11#include "common/Mutex.h"
12#include "common/Cond.h"
13#include "common/Thread.h"
14
15struct OnWriteApplied;
16struct OnWriteCommit;
17struct OnReadComplete;
18struct Cleanup;
19
20class Bencher : public Thread {
21public:
22 enum OpType {
23 WRITE,
24 READ
25 };
26
27private:
28 boost::scoped_ptr<
29 Distribution<boost::tuple<std::string,uint64_t,uint64_t, OpType> > > op_dist;
30 ceph::shared_ptr<StatCollector> stat_collector;
31 boost::scoped_ptr<Backend> backend;
32 const uint64_t max_in_flight;
33 const uint64_t max_duration;
34 const uint64_t max_ops;
35
36 Mutex lock;
37 Cond open_ops_cond;
38 uint64_t open_ops;
39 void start_op();
40 void drain_ops();
41 void complete_op();
42public:
43 Bencher(
44 Distribution<boost::tuple<std::string, uint64_t, uint64_t, OpType> > *op_gen,
45 ceph::shared_ptr<StatCollector> stat_collector,
46 Backend *backend,
47 uint64_t max_in_flight,
48 uint64_t max_duration,
49 uint64_t max_ops) :
50 op_dist(op_gen),
51 stat_collector(stat_collector),
52 backend(backend),
53 max_in_flight(max_in_flight),
54 max_duration(max_duration),
55 max_ops(max_ops),
56 lock("Bencher::lock"),
57 open_ops(0)
58 {}
59 Bencher(
60 Distribution<boost::tuple<std::string, uint64_t, uint64_t, OpType> > *op_gen,
61 StatCollector *stat_collector,
62 Backend *backend,
63 uint64_t max_in_flight,
64 uint64_t max_duration,
65 uint64_t max_ops) :
66 op_dist(op_gen),
67 stat_collector(stat_collector),
68 backend(backend),
69 max_in_flight(max_in_flight),
70 max_duration(max_duration),
71 max_ops(max_ops),
72 lock("Bencher::lock"),
73 open_ops(0)
74 {}
75 Bencher(
76 Distribution<std::string> *object_gen,
77 Distribution<uint64_t> *offset_gen,
78 Distribution<uint64_t> *length_gen,
79 Distribution<OpType> *op_type_gen,
80 StatCollector *stat_collector,
81 Backend *backend,
82 uint64_t max_in_flight,
83 uint64_t max_duration,
84 uint64_t max_ops) :
85 op_dist(
86 new FourTupleDist<std::string, uint64_t, uint64_t, OpType>(
87 object_gen, offset_gen, length_gen, op_type_gen)),
88 stat_collector(stat_collector),
89 backend(backend),
90 max_in_flight(max_in_flight),
91 max_duration(max_duration),
92 max_ops(max_ops),
93 lock("Bencher::lock"),
94 open_ops(0)
95 {}
96
97 void init(
98 const set<std::string> &objects,
99 uint64_t size,
100 std::ostream *out
101 );
102
103 void run_bench();
104 void *entry() override {
105 run_bench();
106 return 0;
107 }
108 friend struct OnWriteApplied;
109 friend struct OnWriteCommit;
110 friend struct OnReadComplete;
111 friend struct Cleanup;
112};
113
114class SequentialLoad :
115 public Distribution<
116 boost::tuple<string, uint64_t, uint64_t, Bencher::OpType> > {
117 set<string> objects;
118 uint64_t size;
119 uint64_t length;
120 set<string>::iterator object_pos;
121 uint64_t cur_pos;
122 boost::scoped_ptr<Distribution<Bencher::OpType> > op_dist;
123 SequentialLoad(const SequentialLoad &other);
124public:
125 SequentialLoad(
126 const set<string> &_objects, uint64_t size,
127 uint64_t length,
128 Distribution<Bencher::OpType> *op_dist)
129 : objects(_objects), size(size), length(length),
130 object_pos(objects.begin()), cur_pos(0),
131 op_dist(op_dist) {}
132
133 boost::tuple<string, uint64_t, uint64_t, Bencher::OpType>
134 operator()() override {
135 boost::tuple<string, uint64_t, uint64_t, Bencher::OpType> ret =
136 boost::make_tuple(*object_pos, cur_pos, length, (*op_dist)());
137 cur_pos += length;
138 if (cur_pos >= size) {
139 cur_pos = 0;
140 ++object_pos;
141 }
142 if (object_pos == objects.end())
143 object_pos = objects.begin();
144 return ret;
145 }
146};
147#endif