summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-06-17 16:38:26 -0700
committerSage Weil <sage@inktank.com>2013-06-17 19:55:12 -0700
commitc14dd154584eef97075e4a260719b6cbe686d4c7 (patch)
tree0395e91803273e1bf444026ebd836f69b27b9c0e
parentaa8834831dbfcdebb96841686e3707e552c349f6 (diff)
downloadceph-c14dd154584eef97075e4a260719b6cbe686d4c7.tar.gz
client: handle reset during initial mds session open
If we get a reset during our attempt to open an MDS session, close out the Connection* and retry to open the session, moving the waiters over. Fixes: #5379 Signed-off-by: Sage Weil <sage@inktank.com> Reviewed-by: Greg Farnum <greg@inktank.com> (cherry picked from commit df8a3e5591948dfd94de2e06640cfe54d2de4322)
-rw-r--r--src/client/Client.cc15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/client/Client.cc b/src/client/Client.cc
index 7f17a3de2a5..fc545a6834b 100644
--- a/src/client/Client.cc
+++ b/src/client/Client.cc
@@ -7856,9 +7856,22 @@ void Client::ms_handle_remote_reset(Connection *con)
}
}
if (mds >= 0) {
- if (s->state == MetaSession::STATE_CLOSING) {
+ switch (s->state) {
+ case MetaSession::STATE_CLOSING:
ldout(cct, 1) << "reset from mds we were closing; we'll call that closed" << dendl;
_closed_mds_session(s);
+ break;
+
+ case MetaSession::STATE_OPENING:
+ {
+ ldout(cct, 1) << "reset from mds we were opening; retrying" << dendl;
+ list<Cond*> waiters;
+ waiters.swap(s->waiting_for_open);
+ _closed_mds_session(s);
+ MetaSession *news = _get_or_open_mds_session(mds);
+ news->waiting_for_open.swap(waiters);
+ }
+ break;
}
}
}