Fixes: #8846
Backport: firefly, dumpling
This was broken at
ea68b9372319fd0bab40856db26528d36359102e. We ended
up calling wait_pending_front() when pending list was empty.
This commit also moves the need_to_wait check to a different place,
where we actually throttle (and not just drain completed IOs).
Reported-by: Sylvain Munaut <s.munaut@whatever-company.com>
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
(cherry picked from commit
f9f2417d7db01ecf2425039539997901615816a9)
int RGWPutObjProcessor_Aio::wait_pending_front()
{
+ if (pending.empty()) {
+ return 0;
+ }
struct put_obj_aio_info info = pop_pending();
int ret = store->aio_wait(info.handle);
return ret;
pending.push_back(info);
}
size_t orig_size = pending.size();
- while (pending_has_completed()
- || need_to_wait) {
+
+ /* first drain complete IOs */
+ while (pending_has_completed()) {
int r = wait_pending_front();
if (r < 0)
return r;
max_chunks++;
}
- if (pending.size() > max_chunks) {
+ /* now throttle. Note that need_to_wait should only affect the first IO operation */
+ if (pending.size() > max_chunks ||
+ need_to_wait) {
int r = wait_pending_front();
if (r < 0)
return r;
+
+ need_to_wait = false;
}
return 0;
}