Project

General

Profile

Bug #10944 » 0001-client-dont-t-release-aborted-request-immediately.patch

Zheng Yan, 07/08/2015 08:15 AM

View differences:

src/client/Client.cc
if (!request->reply) {
assert(request->aborted);
assert(!request->got_unsafe);
request->item.remove_myself();
unregister_request(request);
put_request(request); // ours
return -ETIMEDOUT;
}
......
void Client::send_request(MetaRequest *request, MetaSession *session,
bool drop_cap_releases)
{
if (request->aborted) {
ldout(cct, 10) << "send_request aborted request " << request->get_tid() << dendl;
request->item.remove_myself();
unregister_request(request);
return;
}
// make the request
mds_rank_t mds = session->mds_num;
ldout(cct, 10) << "send_request rebuilding request " << request->get_tid()
......
{
ldout(cct, 10) << "kick_requests for mds." << session->mds_num << dendl;
for (map<ceph_tid_t, MetaRequest*>::iterator p = mds_requests.begin();
p != mds_requests.end();
++p) {
if (p->second->got_unsafe)
p != mds_requests.end(); ) {
MetaRequest* req = p->second;
++p;
if (req->got_unsafe)
continue;
if (p->second->retry_attempt > 0)
if (req->retry_attempt > 0)
continue; // new requests only
if (p->second->mds == session->mds_num) {
send_request(p->second, session);
}
if (req->mds == session->mds_num)
send_request(req, session);
}
}
void Client::resend_unsafe_requests(MetaSession *session)
{
for (xlist<MetaRequest*>::iterator iter = session->unsafe_requests.begin();
!iter.end();
++iter)
send_request(*iter, session);
!iter.end(); ) {
MetaRequest *req = *iter;
++iter;
send_request(req, session);
}
// also re-send old requests when MDS enters reconnect stage. So that MDS can
// process completed requests in clientreplay stage.
for (map<ceph_tid_t, MetaRequest*>::iterator p = mds_requests.begin();
p != mds_requests.end();
++p) {
p != mds_requests.end(); ) {
MetaRequest *req = p->second;
++p;
if (req->got_unsafe)
continue;
if (req->retry_attempt == 0)
(1-1/3)