]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: deny reconnect for closed session
authorYan, Zheng <zheng.z.yan@intel.com>
Mon, 12 May 2014 03:26:20 +0000 (11:26 +0800)
committerYan, Zheng <zheng.z.yan@intel.com>
Mon, 12 May 2014 03:38:40 +0000 (11:38 +0800)
The client that tries reconnect may have dirty caps and unsafe requests.
Allowing the reconnect attempt may compromise consistency.

Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
src/mds/Server.cc

index 8e879cd712738c5a610102b263a88c10119ca48f..6a32e49e1c5c274034aa74e49b6956b262a5020b 100644 (file)
@@ -603,24 +603,19 @@ void Server::handle_client_reconnect(MClientReconnect *m)
     return;
   }
 
-  // notify client of success with an OPEN
-  mds->messenger->send_message(new MClientSession(CEPH_SESSION_OPEN), m->get_connection());
-
   if (session->is_closed()) {
-    dout(10) << " session is closed, will make best effort to reconnect " 
-            << m->get_source_inst() << dendl;
-    mds->sessionmap.set_state(session, Session::STATE_OPENING);
-    version_t pv = ++mds->sessionmap.projected;
-    uint64_t sseq = session->get_state_seq();
-    mdlog->start_submit_entry(new ESession(session->info.inst, true, pv),
-                             new C_MDS_session_finish(mds, session, sseq, true, pv));
-    mdlog->flush();
-    mds->clog.debug() << "reconnect by new " << session->info.inst
-       << " after " << delay << "\n";
-  } else {
-    mds->clog.debug() << "reconnect by " << session->info.inst
-       << " after " << delay << "\n";
+    dout(1) << " session is closed, ignoring reconnect, sending close" << dendl;
+    mds->clog.info() << "denied reconnect attempt (mds is "
+       << ceph_mds_state_name(mds->get_state())
+       << ") from " << m->get_source_inst() << " (session is closed)\n";
+    mds->messenger->send_message(new MClientSession(CEPH_SESSION_CLOSE), m->get_connection());
+    m->put();
+    return;
   }
+
+  // notify client of success with an OPEN
+  mds->messenger->send_message(new MClientSession(CEPH_SESSION_OPEN), m->get_connection());
+  mds->clog.debug() << "reconnect by " << session->info.inst << " after " << delay << "\n";
   
   // snaprealms
   for (vector<ceph_mds_snaprealm_reconnect>::iterator p = m->realms.begin();