mirror of
https://github.com/ceph/ceph
synced 2025-01-03 01:22:53 +00:00
rgw: don't try to wait for pending if list is empty
Fixes: #8846 Backport: firefly, dumpling This was broken atea68b93723
. 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 commitf9f2417d7d
)
This commit is contained in:
parent
3e0d980076
commit
b89ab5f78d
@ -1095,6 +1095,9 @@ struct put_obj_aio_info RGWPutObjProcessor_Aio::pop_pending()
|
||||
|
||||
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;
|
||||
@ -1128,8 +1131,9 @@ int RGWPutObjProcessor_Aio::throttle_data(void *handle, bool need_to_wait)
|
||||
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;
|
||||
@ -1142,10 +1146,14 @@ int RGWPutObjProcessor_Aio::throttle_data(void *handle, bool need_to_wait)
|
||||
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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user