24 #ifndef SEASTAR_MODULE
25 #include <boost/container/small_vector.hpp>
31 #include <seastar/core/sstring.hh>
32 #include <seastar/core/fair_queue.hh>
34 #include <seastar/core/future.hh>
35 #include <seastar/core/internal/io_request.hh>
36 #include <seastar/core/lowres_clock.hh>
37 #include <seastar/util/spinlock.hh>
38 #include <seastar/util/modules.hh>
40 struct io_queue_for_tests;
46 const fair_group& get_fair_group(
const io_queue& ioq,
unsigned stream);
49 #if SEASTAR_API_LEVEL < 7
51 class io_priority_class;
53 [[deprecated(
"Use io_priority_class.rename")]]
55 rename_priority_class(io_priority_class pc, sstring new_name);
71 using shard_id = unsigned;
72 using stream_id = unsigned;
74 class io_desc_read_write;
75 class queued_io_request;
78 using io_group_ptr = std::shared_ptr<io_group>;
79 using iovec_keeper = std::vector<::iovec>;
82 struct maybe_priority_class_ref;
83 class priority_class {
86 #if SEASTAR_API_LEVEL < 7
87 explicit priority_class(
const io_priority_class& pc) noexcept;
89 explicit priority_class(
const scheduling_group& sg) noexcept;
90 explicit priority_class(internal::maybe_priority_class_ref pc) noexcept;
91 unsigned id() const noexcept {
return _id; }
97 class priority_class_data;
100 std::vector<std::unique_ptr<priority_class_data>> _priority_classes;
102 boost::container::small_vector<fair_queue, 2> _streams;
103 internal::io_sink& _sink;
105 friend struct ::io_queue_for_tests;
108 priority_class_data& find_or_create_class(internal::priority_class pc);
109 future<size_t> queue_request(internal::priority_class pc, internal::io_direction_and_length dnl, internal::io_request req,
io_intent* intent, iovec_keeper iovs) noexcept;
110 future<size_t> queue_one_request(internal::priority_class pc, internal::io_direction_and_length dnl, internal::io_request req,
io_intent* intent, iovec_keeper iovs) noexcept;
116 size_t _queued_requests = 0;
117 size_t _requests_executing = 0;
118 uint64_t _requests_dispatched = 0;
119 uint64_t _requests_completed = 0;
122 uint64_t _prev_dispatched = 0;
123 uint64_t _prev_completed = 0;
124 double _flow_ratio = 1.0;
127 void update_flow_ratio() noexcept;
132 using clock_type = std::chrono::steady_clock;
142 static constexpr
unsigned read_request_base_count = 128;
143 static constexpr
unsigned block_size_shift = 9;
147 unsigned long req_count_rate = std::numeric_limits<int>::max();
148 unsigned long blocks_count_rate = std::numeric_limits<int>::max();
149 unsigned disk_req_write_to_read_multiplier = read_request_base_count;
150 unsigned disk_blocks_write_to_read_multiplier = read_request_base_count;
151 size_t disk_read_saturation_length = std::numeric_limits<size_t>::max();
152 size_t disk_write_saturation_length = std::numeric_limits<size_t>::max();
153 sstring mountpoint =
"undefined";
155 float rate_factor = 1.0;
156 std::chrono::duration<double> rate_limit_duration = std::chrono::milliseconds(1);
157 size_t block_count_limit_min = 1;
158 unsigned flow_ratio_ticks = 100;
159 double flow_ratio_ema_factor = 0.95;
160 double flow_ratio_backpressure_threshold = 1.1;
163 io_queue(io_group_ptr group, internal::io_sink& sink);
166 stream_id request_stream(internal::io_direction_and_length dnl)
const noexcept;
168 future<size_t> submit_io_read(internal::priority_class priority_class,
169 size_t len, internal::io_request req,
io_intent* intent, iovec_keeper iovs = {}) noexcept;
170 future<size_t> submit_io_write(internal::priority_class priority_class,
171 size_t len, internal::io_request req,
io_intent* intent, iovec_keeper iovs = {}) noexcept;
173 void submit_request(io_desc_read_write* desc, internal::io_request req) noexcept;
174 void cancel_request(queued_io_request& req) noexcept;
175 void complete_cancelled_request(queued_io_request& req) noexcept;
176 void complete_request(io_desc_read_write& desc) noexcept;
178 [[deprecated(
"I/O queue users should not track individual requests, but resources (weight, size) passing through the queue")]]
179 size_t queued_requests()
const {
180 return _queued_requests;
184 [[deprecated(
"I/O queue users should not track individual requests, but resources (weight, size) passing through the queue")]]
185 size_t requests_currently_executing()
const {
186 return _requests_executing;
190 void poll_io_queue();
192 clock_type::time_point next_pending_aio() const noexcept;
193 fair_queue_entry::capacity_t request_capacity(internal::io_direction_and_length dnl) const noexcept;
195 sstring mountpoint() const;
196 dev_t dev_id() const noexcept;
198 void update_shares_for_class(internal::priority_class pc,
size_t new_shares);
199 future<> update_bandwidth_for_class(internal::priority_class pc, uint64_t new_bandwidth);
200 void rename_priority_class(internal::priority_class pc, sstring new_name);
201 void throttle_priority_class(const priority_class_data& pc) noexcept;
202 void unthrottle_priority_class(const priority_class_data& pc) noexcept;
210 const
config& get_config() const noexcept;
214 void register_stats(sstring name, priority_class_data& pc);
221 struct priority_class_data;
223 std::chrono::duration<double> io_latency_goal()
const noexcept;
227 friend struct ::io_queue_for_tests;
231 size_t _max_request_length[2];
232 std::vector<std::unique_ptr<fair_group>> _fgs;
233 std::vector<std::unique_ptr<priority_class_data>> _priority_classes;
235 const shard_id _allocated_on;
238 priority_class_data& find_or_create_class(internal::priority_class pc);
242 return _group->_config;
245 inline sstring io_queue::mountpoint()
const {
246 return get_config().mountpoint;
249 inline dev_t io_queue::dev_id() const noexcept {
250 return get_config().devid;
254 double request_tokens(io_direction_and_length dnl,
const io_queue::config& cfg) noexcept;
Group of queues class.
Definition: fair_queue.hh:138
Definition: fair_queue.hh:236
Fair queuing class.
Definition: fair_queue.hh:290
Definition: io_queue.hh:217
Definition: io_intent.hh:44
Definition: io_queue.hh:95
Definition: io_queue.hh:145
Definition: io_queue.hh:204
holds the metric definition.
Definition: metrics_registration.hh:94
Definition: spinlock.hh:88
holds the metric_groups definition needed by class that reports metrics
Seastar API namespace.
Definition: abort_on_ebadf.hh:26