]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds/FSMap: stricter state_transition_valid
author胡玮文 <huww98@outlook.com>
Sun, 9 Jan 2022 14:52:16 +0000 (22:52 +0800)
committerVenky Shankar <vshankar@redhat.com>
Tue, 27 Sep 2022 07:48:56 +0000 (13:18 +0530)
Reject any unknown transitions.

MDSRank::state initialize to standy and assert no update is missed.

Signed-off-by: 胡玮文 <huww98@outlook.com>
(cherry picked from commit 0601552b91a1c91314bc6799514f972098b02f30)

src/mds/MDSMap.cc
src/mds/MDSRank.cc
src/mds/MDSRank.h

index 70214658ed683f5a35cac629862afbe3f6f28172..f611d86a5ba640544d6c89f79d69a8ee6b7dfbc5 100644 (file)
@@ -974,28 +974,44 @@ MDSMap::availability_t MDSMap::is_cluster_available() const
 
 bool MDSMap::state_transition_valid(DaemonState prev, DaemonState next)
 {
-  bool state_valid = true;
-  if (next != prev) {
-    if (prev == MDSMap::STATE_REPLAY) {
-      if (next != MDSMap::STATE_RESOLVE && next != MDSMap::STATE_RECONNECT) {
-        state_valid = false;
-      }
-    } else if (prev == MDSMap::STATE_REJOIN) {
-      if (next != MDSMap::STATE_ACTIVE &&
-         next != MDSMap::STATE_CLIENTREPLAY &&
-         next != MDSMap::STATE_STOPPED) {
-        state_valid = false;
-      }
-    } else if (prev >= MDSMap::STATE_RESOLVE && prev < MDSMap::STATE_ACTIVE) {
-      // Once I have entered replay, the only allowable transitions are to
-      // the next next along in the sequence.
-      if (next != prev + 1) {
-        state_valid = false;
-      }
+  if (next == prev)
+    return true;
+  if (next == MDSMap::STATE_DAMAGED)
+    return true;
+
+  if (prev == MDSMap::STATE_BOOT) {
+    return next == MDSMap::STATE_STANDBY;
+  } else if (prev == MDSMap::STATE_STANDBY) {
+    return next == MDSMap::STATE_STANDBY_REPLAY ||
+           next == MDSMap::STATE_REPLAY ||
+           next == MDSMap::STATE_CREATING ||
+           next == MDSMap::STATE_STARTING;
+  } else if (prev == MDSMap::STATE_CREATING || prev == MDSMap::STATE_STARTING) {
+    return next == MDSMap::STATE_ACTIVE;
+  } else if (prev == MDSMap::STATE_STANDBY_REPLAY) {
+    return next == MDSMap::STATE_REPLAY;
+  } else if (prev == MDSMap::STATE_REPLAY) {
+    return next == MDSMap::STATE_RESOLVE ||
+           next == MDSMap::STATE_RECONNECT;
+  } else if (prev >= MDSMap::STATE_RESOLVE && prev < MDSMap::STATE_ACTIVE) {
+    // Once I have entered replay, the only allowable transitions are to
+    // the next next along in the sequence.
+    // Except...
+    if (prev == MDSMap::STATE_REJOIN &&
+        (next == MDSMap::STATE_ACTIVE ||    // No need to do client replay
+         next == MDSMap::STATE_STOPPED)) {  // no subtrees
+      return true;         
     }
+    return next == prev + 1;
+  } else if (prev == MDSMap::STATE_ACTIVE) {
+    return next == MDSMap::STATE_STOPPING;
+  } else if (prev == MDSMap::STATE_STOPPING) {
+    return next == MDSMap::STATE_STOPPED;
+  } else {
+    derr << __func__ << ": Unknown prev state "
+         << ceph_mds_state_name(prev) << "(" << prev << ")" << dendl;
+    return false;
   }
-
-  return state_valid;
 }
 
 bool MDSMap::check_health(mds_rank_t standby_daemon_count)
index 03ee64cd7ebbc4bd5c31867929e4c81e24e15901..bae7706f6ad2f3c9062dcb78d7d6cdd8fe51f564 100644 (file)
@@ -2233,8 +2233,15 @@ void MDSRankDispatcher::handle_mds_map(
   // I am only to be passed MDSMaps in which I hold a rank
   ceph_assert(whoami != MDS_RANK_NONE);
 
-  MDSMap::DaemonState oldstate = state;
   mds_gid_t mds_gid = mds_gid_t(monc->get_global_id());
+  MDSMap::DaemonState oldstate = oldmap.get_state_gid(mds_gid);
+  if (oldstate == MDSMap::STATE_NULL) {
+    // monitor may skip sending me the STANDBY map (e.g. if paxos_propose_interval is high)
+    // Assuming I have passed STANDBY state if I got a rank in the first map.
+    oldstate = MDSMap::STATE_STANDBY;
+  }
+  // I should not miss map update
+  ceph_assert(state == oldstate);
   state = mdsmap->get_state_gid(mds_gid);
   if (state != oldstate) {
     last_state = oldstate;
index 9b1e35118205fc4d977d4988a68e5d8a1b2b92c7..31d9992bed7120add07ae0a039b1fe8ef2aa1432 100644 (file)
@@ -415,7 +415,7 @@ class MDSRank {
     // The last different state I held before current
     MDSMap::DaemonState last_state = MDSMap::STATE_BOOT;
     // The state assigned to me by the MDSMap
-    MDSMap::DaemonState state = MDSMap::STATE_BOOT;
+    MDSMap::DaemonState state = MDSMap::STATE_STANDBY;
 
     bool cluster_degraded = false;