]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: handle imported session race 21988/head
authorPatrick Donnelly <pdonnell@redhat.com>
Mon, 14 May 2018 04:27:51 +0000 (21:27 -0700)
committerPatrick Donnelly <pdonnell@redhat.com>
Mon, 14 May 2018 20:31:22 +0000 (13:31 -0700)
Thanks to Yan Zheng for identifying and reviewing the fix.

Fixes: http://tracker.ceph.com/issues/24087
Signed-off-by: Patrick Donnelly <pdonnell@redhat.com>
(cherry picked from commit b9c3751e9e375c679bada1fab228b52420cf7a4b)

src/mds/MDSRank.cc
src/mds/SessionMap.h

index da618b1889644543128a03a97e290ab11fdf9422..93a0f4839f29af3e398682bfdc7330eb6fdfa28c 100644 (file)
@@ -901,9 +901,29 @@ Session *MDSRank::get_session(Message *m)
 {
   Session *session = static_cast<Session *>(m->get_connection()->get_priv());
   if (session) {
+    session->put(); // do not carry ref
     dout(20) << "get_session have " << session << " " << session->info.inst
             << " state " << session->get_state_name() << dendl;
-    session->put();  // not carry ref
+    // Check if we've imported an open session since (new sessions start closed)
+    if (session->is_closed()) {
+      Session *imported_session = sessionmap.get_session(session->info.inst.name);
+      if (imported_session && imported_session != session) {
+        dout(10) << __func__ << " replacing connection bootstrap session " << session << " with imported session " << imported_session << dendl;
+        imported_session->info.auth_name = session->info.auth_name;
+        //assert(session->info.auth_name == imported_session->info.auth_name);
+        assert(session->info.inst == imported_session->info.inst);
+        imported_session->connection = session->connection;
+        // send out any queued messages
+        while (!session->preopen_out_queue.empty()) {
+          imported_session->connection->send_message(session->preopen_out_queue.front());
+          session->preopen_out_queue.pop_front();
+        }
+        imported_session->auth_caps = session->auth_caps;
+        assert(session->get_nref() == 1);
+        imported_session->connection->set_priv(imported_session->get());
+        session = imported_session;
+      }
+    }
   } else {
     dout(20) << "get_session dne for " << m->get_source_inst() << dendl;
   }
index 499b171eecc8771b62a90b307e14c9216f829ba1..b9714eeb01044a2570bc9330489cf394f74b78a4 100644 (file)
@@ -330,7 +330,11 @@ public:
     num_trim_flushes_warnings(0),
     num_trim_requests_warnings(0) { }
   ~Session() override {
-    assert(!item_session_list.is_on_list());
+    if (state == STATE_CLOSED) {
+      item_session_list.remove_myself();
+    } else {
+      assert(!item_session_list.is_on_list());
+    }
     while (!preopen_out_queue.empty()) {
       preopen_out_queue.front()->put();
       preopen_out_queue.pop_front();