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:54:51 -0700
commitdf8a3e5591948dfd94de2e06640cfe54d2de4322 (patch)
treee804c5b953f50bf63e95514c5e59ea2a10adb1ec
parent92997a49bf0e58e207193850b94da3f7147f331a (diff)
downloadceph-df8a3e5591948dfd94de2e06640cfe54d2de4322.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>
-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 a17254b60b5..cfebcdb03d9 100644
--- a/src/client/Client.cc
+++ b/src/client/Client.cc
@@ -7889,9 +7889,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;
}
}
}