From 485d139015b835ec7038799c51e43f4694e6981f Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Wed, 7 Jan 2015 16:22:29 +0800 Subject: [PATCH] client: fix mount timeout implement a simple timeout mechanism for make_request() Fixes: #10041 Signed-off-by: Yan, Zheng --- src/client/Client.cc | 29 +++++++++++++++++++++++++++++ src/client/MetaRequest.h | 3 ++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index fa47ac938b1..ac33425fe7f 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -1478,6 +1478,9 @@ int Client::make_request(MetaRequest *request, request->resend_mds = use_mds; while (1) { + if (request->aborted) + break; + // set up wait cond Cond caller_cond; request->caller_cond = &caller_cond; @@ -1536,6 +1539,16 @@ int Client::make_request(MetaRequest *request, break; } + if (!request->reply) { + assert(request->aborted); + assert(!request->got_unsafe); + request->item.remove_myself(); + mds_requests.erase(tid); + put_request(request); // request map's + put_request(request); // ours + return -ETIMEDOUT; + } + // got it! MClientReply *reply = request->reply; request->reply = NULL; @@ -4763,6 +4776,22 @@ void Client::tick() utime_t now = ceph_clock_now(cct); + if (!mounted && !mds_requests.empty()) { + MetaRequest *req = mds_requests.begin()->second; + if (req->op_stamp + cct->_conf->client_mount_timeout < now) { + req->aborted = true; + if (req->caller_cond) { + req->kick = true; + req->caller_cond->Signal(); + } + signal_cond_list(waiting_for_mdsmap); + for (map::iterator p = mds_sessions.begin(); + p != mds_sessions.end(); + ++p) + signal_context_list(p->second->waiting_for_open); + } + } + if (mdsmap->get_epoch()) { // renew caps? utime_t el = now - last_cap_renew; diff --git a/src/client/MetaRequest.h b/src/client/MetaRequest.h index 24b2f54cef4..e3b6bd167cc 100644 --- a/src/client/MetaRequest.h +++ b/src/client/MetaRequest.h @@ -53,6 +53,7 @@ public: MClientReply *reply; // the reply bool kick; + bool aborted; // readdir result frag_t readdir_frag; @@ -90,7 +91,7 @@ public: mds(-1), resend_mds(-1), send_to_auth(false), sent_on_mseq(0), num_fwd(0), retry_attempt(0), ref(1), reply(0), - kick(false), + kick(false), aborted(false), readdir_offset(0), readdir_end(false), readdir_num(0), got_unsafe(false), item(this), unsafe_item(this), lock("MetaRequest lock"), -- 2.47.3