]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: ignore sessionmap version mismatch if mds_wipe_sessions is set 28536/head
authorYan, Zheng <zyan@redhat.com>
Sat, 8 Jun 2019 09:33:14 +0000 (17:33 +0800)
committerYan, Zheng <zyan@redhat.com>
Thu, 13 Jun 2019 16:43:41 +0000 (00:43 +0800)
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
(cherry picked from commit 2a20605c0393692bae4780ef3bd0cc684995d028)

 Conflicts:
src/mds/SessionMap.h
src/mds/journal.cc

src/mds/SessionMap.cc
src/mds/SessionMap.h
src/mds/journal.cc

index 286c6056476c0f3b23bce43ce6d644f10574aa58..1a3412c58e2d14ce42b89e654446fa97408b9bc8 100644 (file)
@@ -712,6 +712,41 @@ void SessionMap::replay_advance_version()
   projected = version;
 }
 
+void SessionMap::replay_open_sessions(version_t event_cmapv,
+                                     map<client_t,entity_inst_t>& client_map)
+{
+  unsigned already_saved;
+
+  if (version + client_map.size() < event_cmapv)
+    goto bad;
+
+  // Server::finish_force_open_sessions() marks sessions dirty one by one.
+  // Marking a session dirty may flush all existing dirty sessions. So it's
+  // possible that some sessions are already saved in sessionmap.
+  already_saved = client_map.size() - (event_cmapv - version);
+  for (const auto& p : client_map) {
+    Session *s = get_or_add_session(p.second);
+    if (already_saved > 0) {
+      if (s->is_closed())
+       goto bad;
+
+      --already_saved;
+      continue;
+    }
+
+    set_state(s, Session::STATE_OPEN);
+    replay_dirty_session(s);
+  }
+  return;
+
+bad:
+  mds->clog->error() << "error replaying open sessions(" << client_map.size()
+                    << ") sessionmap v " << event_cmapv << " table " << version;
+  ceph_assert(g_conf->mds_wipe_sessions);
+  mds->sessionmap.wipe();
+  mds->sessionmap.set_version(event_cmapv);
+}
+
 version_t SessionMap::mark_projected(Session *s)
 {
   dout(20) << __func__ << " s=" << s << " name=" << s->info.inst.name
index ad054c578b4b230641aa108f067fe4080633623e..6ab8fc16169d66bd309be3f20363566e922b840e 100644 (file)
@@ -637,28 +637,6 @@ public:
     get_client_sessions(f);
   }
 
-  void replay_open_sessions(version_t event_cmapv,
-                           map<client_t,entity_inst_t>& client_map) {
-    // Server::finish_force_open_sessions() marks sessions dirty one by one.
-    // Marking a session dirty may flush all existing dirty sessions. So it's
-    // possible that some sessions are already saved in sessionmap.
-    ceph_assert(version + client_map.size() >= event_cmapv);
-    unsigned already_saved = client_map.size() - (event_cmapv - version);
-    for (map<client_t,entity_inst_t>::iterator p = client_map.begin(); 
-        p != client_map.end(); 
-        ++p) {
-      Session *s = get_or_add_session(p->second);
-      if (already_saved > 0) {
-       ceph_assert(s->is_open());
-       --already_saved;
-       continue;
-      }
-
-      set_state(s, Session::STATE_OPEN);
-      replay_dirty_session(s);
-    }
-  }
-
   // helpers
   entity_inst_t& get_inst(entity_name_t w) {
     assert(session_map.count(w));
@@ -748,6 +726,13 @@ public:
    */
   void replay_advance_version();
 
+  /**
+   * During replay, open sessions, advance versions and
+   * mark these sessions as dirty.
+   */
+  void replay_open_sessions(version_t event_cmapv,
+                           map<client_t,entity_inst_t>& client_map);
+
   /**
    * For these session IDs, if a session exists with this ID, and it has
    * dirty completed_requests, then persist it immediately
index 8ad24ca84d8bb4d1886cd3e2f40e8689e21d8849..419f5fa921a2e4ecd9172459ba309cf95736f63f 100644 (file)
@@ -1557,12 +1557,13 @@ void EMetaBlob::replay(MDSRank *mds, LogSegment *logseg, MDSlaveUpdate *slaveup)
     }
   }
   if (sessionmapv) {
+    unsigned diff = (used_preallocated_ino && !preallocated_inos.empty()) ? 2 : 1;
     if (mds->sessionmap.get_version() >= sessionmapv) {
       dout(10) << "EMetaBlob.replay sessionmap v " << sessionmapv
               << " <= table " << mds->sessionmap.get_version() << dendl;
-    } else if (mds->sessionmap.get_version() + 2 >= sessionmapv) {
+    } else if (mds->sessionmap.get_version() + diff == sessionmapv) {
       dout(10) << "EMetaBlob.replay sessionmap v " << sessionmapv
-              << " -(1|2) == table " << mds->sessionmap.get_version()
+              << " - " << diff << " == table " << mds->sessionmap.get_version()
               << " prealloc " << preallocated_inos
               << " used " << used_preallocated_ino
               << dendl;
@@ -1588,17 +1589,17 @@ void EMetaBlob::replay(MDSRank *mds, LogSegment *logseg, MDSlaveUpdate *slaveup)
 
       } else {
        dout(10) << "EMetaBlob.replay no session for " << client_name << dendl;
-       if (used_preallocated_ino) {
+       if (used_preallocated_ino)
          mds->sessionmap.replay_advance_version();
-        }
+
        if (!preallocated_inos.empty())
          mds->sessionmap.replay_advance_version();
       }
       assert(sessionmapv == mds->sessionmap.get_version());
     } else {
-      mds->clog->error() << "journal replay sessionmap v " << sessionmapv
-                       << " -(1|2) > table " << mds->sessionmap.get_version();
-      assert(g_conf->mds_wipe_sessions);
+      mds->clog->error() << "EMetaBlob.replay sessionmap v " << sessionmapv
+                        << " - " << diff << " > table " << mds->sessionmap.get_version();
+      ceph_assert(g_conf->mds_wipe_sessions);
       mds->sessionmap.wipe();
       mds->sessionmap.set_version(sessionmapv);
     }
@@ -1696,7 +1697,7 @@ void ESession::replay(MDSRank *mds)
   if (mds->sessionmap.get_version() >= cmapv) {
     dout(10) << "ESession.replay sessionmap " << mds->sessionmap.get_version() 
             << " >= " << cmapv << ", noop" << dendl;
-  } else {
+  } else if (mds->sessionmap.get_version() + 1 == cmapv) {
     dout(10) << "ESession.replay sessionmap " << mds->sessionmap.get_version()
             << " < " << cmapv << " " << (open ? "open":"close") << " " << client_inst << dendl;
     Session *session;
@@ -1726,7 +1727,13 @@ void ESession::replay(MDSRank *mds)
     } else {
       mds->sessionmap.replay_advance_version();
     }
-    assert(mds->sessionmap.get_version() == cmapv);
+    ceph_assert(mds->sessionmap.get_version() == cmapv);
+  } else {
+    mds->clog->error() << "ESession.replay sessionmap v " << cmapv
+                      << " - 1 > table " << mds->sessionmap.get_version();
+    ceph_assert(g_conf->mds_wipe_sessions);
+    mds->sessionmap.wipe();
+    mds->sessionmap.set_version(cmapv);
   }
   
   if (inos.size() && inotablev) {