From: Yehuda Sadeh Date: Thu, 14 Jan 2016 00:36:21 +0000 (-0800) Subject: rgw: link_pending_requests() fixes X-Git-Tag: v10.1.0~354^2~54 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=22faa002a75b11f2eb4850b060ee668bcc11c18e;p=ceph.git rgw: link_pending_requests() fixes set aside the list of reqs we need to finish, and only then iterate through that list and finish. Otherwise we corrupt the reqs map. Also clear reqs map on shutdown so that we don't end up clearing it twice in certain cases. Signed-off-by: Yehuda Sadeh --- diff --git a/src/rgw/rgw_http_client.cc b/src/rgw/rgw_http_client.cc index c906d948598c..1c241ba43d13 100644 --- a/src/rgw/rgw_http_client.cc +++ b/src/rgw/rgw_http_client.cc @@ -406,14 +406,24 @@ void RGWHTTPManager::link_pending_requests() map::iterator iter = reqs.find(max_threaded_req); + list > remove_reqs; + for (; iter != reqs.end(); ++iter) { rgw_http_req_data *req_data = iter->second; int r = link_request(req_data); if (r < 0) { ldout(cct, 0) << "ERROR: failed to link http request" << dendl; - _finish_request(req_data, r); + remove_reqs.push_back(std::make_pair(iter->second, r)); + } else { + max_threaded_req = iter->first + 1; } - max_threaded_req = iter->first + 1; + } + + for (auto piter : remove_reqs) { + rgw_http_req_data *req_data = piter.first; + int r = piter.second; + + _finish_request(req_data, r); } } @@ -606,6 +616,8 @@ void *RGWHTTPManager::reqs_thread_entry() _finish_request(iter->second, -ECANCELED); } + reqs.clear(); + if (completion_mgr) { completion_mgr->go_down(); }