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/util/spinlock.hh>
37 #include <seastar/util/modules.hh>
39 struct io_queue_for_tests;
45 const fair_group& get_fair_group(
const io_queue& ioq,
unsigned stream);
48 #if SEASTAR_API_LEVEL < 7
50 class io_priority_class;
52 [[deprecated(
"Use io_priority_class.rename")]]
54 rename_priority_class(io_priority_class pc, sstring new_name);
70 using shard_id = unsigned;
71 using stream_id = unsigned;
73 class io_desc_read_write;
74 class queued_io_request;
77 using io_group_ptr = std::shared_ptr<io_group>;
78 using iovec_keeper = std::vector<::iovec>;
81 struct maybe_priority_class_ref;
82 class priority_class {
85 #if SEASTAR_API_LEVEL < 7
86 explicit priority_class(
const io_priority_class& pc) noexcept;
88 explicit priority_class(
const scheduling_group& sg) noexcept;
89 explicit priority_class(internal::maybe_priority_class_ref pc) noexcept;
90 unsigned id() const noexcept {
return _id; }
96 class priority_class_data;
99 std::vector<std::unique_ptr<priority_class_data>> _priority_classes;
101 boost::container::small_vector<fair_queue, 2> _streams;
102 internal::io_sink& _sink;
104 friend struct ::io_queue_for_tests;
107 priority_class_data& find_or_create_class(internal::priority_class pc);
108 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;
109 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;
115 size_t _queued_requests = 0;
116 size_t _requests_executing = 0;
119 using clock_type = std::chrono::steady_clock;
129 static constexpr
unsigned read_request_base_count = 128;
130 static constexpr
unsigned block_size_shift = 9;
134 unsigned long req_count_rate = std::numeric_limits<int>::max();
135 unsigned long blocks_count_rate = std::numeric_limits<int>::max();
136 unsigned disk_req_write_to_read_multiplier = read_request_base_count;
137 unsigned disk_blocks_write_to_read_multiplier = read_request_base_count;
138 size_t disk_read_saturation_length = std::numeric_limits<size_t>::max();
139 size_t disk_write_saturation_length = std::numeric_limits<size_t>::max();
140 sstring mountpoint =
"undefined";
142 float rate_factor = 1.0;
143 std::chrono::duration<double> rate_limit_duration = std::chrono::milliseconds(1);
144 size_t block_count_limit_min = 1;
147 io_queue(io_group_ptr group, internal::io_sink& sink);
150 stream_id request_stream(internal::io_direction_and_length dnl)
const noexcept;
152 future<size_t> submit_io_read(internal::priority_class priority_class,
153 size_t len, internal::io_request req,
io_intent* intent, iovec_keeper iovs = {}) noexcept;
154 future<size_t> submit_io_write(internal::priority_class priority_class,
155 size_t len, internal::io_request req,
io_intent* intent, iovec_keeper iovs = {}) noexcept;
157 void submit_request(io_desc_read_write* desc, internal::io_request req) noexcept;
158 void cancel_request(queued_io_request& req) noexcept;
159 void complete_cancelled_request(queued_io_request& req) noexcept;
160 void complete_request(io_desc_read_write& desc) noexcept;
162 [[deprecated(
"I/O queue users should not track individual requests, but resources (weight, size) passing through the queue")]]
163 size_t queued_requests()
const {
164 return _queued_requests;
168 [[deprecated(
"I/O queue users should not track individual requests, but resources (weight, size) passing through the queue")]]
169 size_t requests_currently_executing()
const {
170 return _requests_executing;
174 void poll_io_queue();
176 clock_type::time_point next_pending_aio() const noexcept;
177 fair_queue_entry::capacity_t request_capacity(internal::io_direction_and_length dnl) const noexcept;
179 sstring mountpoint() const;
180 dev_t dev_id() const noexcept;
182 void update_shares_for_class(internal::priority_class pc,
size_t new_shares);
183 future<> update_bandwidth_for_class(internal::priority_class pc, uint64_t new_bandwidth);
184 void rename_priority_class(internal::priority_class pc, sstring new_name);
185 void throttle_priority_class(const priority_class_data& pc) noexcept;
186 void unthrottle_priority_class(const priority_class_data& pc) noexcept;
194 const
config& get_config() const noexcept;
198 void register_stats(sstring name, priority_class_data& pc);
205 struct priority_class_data;
209 friend struct ::io_queue_for_tests;
213 size_t _max_request_length[2];
214 std::vector<std::unique_ptr<fair_group>> _fgs;
215 std::vector<std::unique_ptr<priority_class_data>> _priority_classes;
217 const shard_id _allocated_on;
220 priority_class_data& find_or_create_class(internal::priority_class pc);
224 return _group->_config;
227 inline sstring io_queue::mountpoint()
const {
228 return get_config().mountpoint;
231 inline dev_t io_queue::dev_id() const noexcept {
232 return get_config().devid;
236 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:291
Definition: io_queue.hh:201
Definition: io_intent.hh:44
Definition: io_queue.hh:94
Definition: io_queue.hh:132
Definition: io_queue.hh:188
Definition: spinlock.hh:88
holds the metric_groups definition needed by class that reports metrics
Seastar API namespace.
Definition: abort_on_ebadf.hh:26