]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: introduce explicit DaemonState instead of int
authorJohn Spray <john.spray@redhat.com>
Mon, 21 Jul 2014 19:22:46 +0000 (20:22 +0100)
committerJohn Spray <john.spray@redhat.com>
Tue, 29 Jul 2014 21:32:43 +0000 (22:32 +0100)
Signed-off-by: John Spray <john.spray@redhat.com>
src/ceph_mds.cc
src/mds/MDS.cc
src/mds/MDS.h
src/mds/MDSMap.cc
src/mds/MDSMap.h
src/messages/MMDSBeacon.h
src/mon/MDSMonitor.cc

index 3e9fb223bd5bbb84da045189966a35b6b0675d4f..b1ab386cc6762b446c52051f66c0ee69c8416bdc 100644 (file)
@@ -94,7 +94,7 @@ int main(int argc, const char **argv)
   global_init(NULL, args, CEPH_ENTITY_TYPE_MDS, CODE_ENVIRONMENT_DAEMON, 0);
 
   // mds specific args
-  int shadow = 0;
+  MDSMap::DaemonState shadow = MDSMap::STATE_NULL;
   std::string dump_file;
 
   std::string val, action;
@@ -104,7 +104,7 @@ int main(int argc, const char **argv)
     }
     else if (ceph_argparse_witharg(args, i, &val, "--journal-check", (char*)NULL)) {
       int r = parse_rank("journal-check", val);
-      if (shadow) {
+      if (shadow != MDSMap::STATE_NULL) {
         dout(0) << "Error: can only select one standby state" << dendl;
         return -1;
       }
index 3a9adb2ec008583e3837a9b37c0edc5758a84866..65a5a252b19a5872b7d44d27e5168d189ab48c78 100644 (file)
@@ -98,7 +98,7 @@ MDS::MDS(const std::string &n, Messenger *m, MonClient *mc) :
   name(n),
   whoami(-1), incarnation(0),
   standby_for_rank(MDSMap::MDS_NO_STANDBY_PREF),
-  standby_type(0),
+  standby_type(MDSMap::STATE_NULL),
   standby_replaying(false),
   messenger(m),
   monc(mc),
@@ -573,7 +573,7 @@ void MDS::send_message_client(Message *m, Session *session)
   }
 }
 
-int MDS::init(int wanted_state)
+int MDS::init(MDSMap::DaemonState wanted_state)
 {
   dout(10) << sizeof(MDSCacheObject) << "\tMDSCacheObject" << dendl;
   dout(10) << sizeof(CInode) << "\tCInode" << dendl;
@@ -647,14 +647,16 @@ int MDS::init(int wanted_state)
   }
 
   mds_lock.Lock();
-  if (want_state == CEPH_MDS_STATE_DNE) {
+  if (want_state == MDSMap::STATE_DNE) {
     suicide();  // we could do something more graceful here
   }
 
   timer.init();
 
-  if (wanted_state==MDSMap::STATE_BOOT && g_conf->mds_standby_replay)
+  if (wanted_state==MDSMap::STATE_BOOT && g_conf->mds_standby_replay) {
     wanted_state = MDSMap::STATE_STANDBY_REPLAY;
+  }
+
   // starting beacon.  this will induce an MDSMap from the monitor
   want_state = wanted_state;
   if (wanted_state==MDSMap::STATE_STANDBY_REPLAY ||
@@ -681,7 +683,7 @@ int MDS::init(int wanted_state)
       standby_for_rank = MDSMap::MDS_STANDBY_ANY;
     else
       standby_for_rank = MDSMap::MDS_STANDBY_NAME;
-  } else if (!standby_type && !standby_for_name.empty())
+  } else if (standby_type == MDSMap::STATE_NULL && !standby_for_name.empty())
     standby_for_rank = MDSMap::MDS_MATCHED_ACTIVE;
 
   beacon_start();
@@ -1023,7 +1025,7 @@ void MDS::handle_mds_map(MMDSMap *m)
   // keep old map, for a moment
   MDSMap *oldmap = mdsmap;
   int oldwhoami = whoami;
-  int oldstate = state;
+  MDSMap::DaemonState oldstate = state;
   entity_addr_t addr;
 
   // decode and process
@@ -1074,7 +1076,7 @@ void MDS::handle_mds_map(MMDSMap *m)
 
     goto out;
   } else if (state == MDSMap::STATE_STANDBY_REPLAY) {
-    if (standby_type && standby_type != MDSMap::STATE_STANDBY_REPLAY) {
+    if (standby_type != MDSMap::STATE_NULL && standby_type != MDSMap::STATE_STANDBY_REPLAY) {
       want_state = standby_type;
       beacon_send();
       state = oldstate;
@@ -1309,7 +1311,7 @@ void MDS::bcast_mds_map()
 }
 
 
-void MDS::request_state(int s)
+void MDS::request_state(MDSMap::DaemonState s)
 {
   dout(3) << "request_state " << ceph_mds_state_name(s) << dendl;
   want_state = s;
@@ -1494,7 +1496,7 @@ void MDS::replay_start()
   if (is_standby_replay())
     standby_replaying = true;
   
-  standby_type = 0;
+  standby_type = MDSMap::STATE_NULL;
 
   calc_recovery_set();
 
@@ -1801,7 +1803,7 @@ void MDS::handle_signal(int signum)
 void MDS::suicide()
 {
   assert(mds_lock.is_locked());
-  want_state = CEPH_MDS_STATE_DNE; // whatever.
+  want_state = MDSMap::STATE_DNE; // whatever.
 
   dout(1) << "suicide.  wanted " << ceph_mds_state_name(want_state)
          << ", now " << ceph_mds_state_name(state) << dendl;
index 5beba79fd70762cb8b5747de3645d5a0da75a47b..493857a8cb4bd7e4718aea205c1bee9cb74008a4 100644 (file)
@@ -153,7 +153,7 @@ class MDS : public Dispatcher, public md_config_obs_t {
   int incarnation;
 
   int standby_for_rank;
-  int standby_type;
+  MDSMap::DaemonState standby_type;  // one of STANDBY_REPLAY, ONESHOT_REPLAY
   string standby_for_name;
   bool standby_replaying;  // true if current replay pass is in standby-replay mode
 
@@ -188,9 +188,9 @@ class MDS : public Dispatcher, public md_config_obs_t {
 
  protected:
   // -- MDS state --
-  int last_state;
-  int state;         // my confirmed state
-  int want_state;    // the state i want
+  MDSMap::DaemonState last_state;
+  MDSMap::DaemonState state;         // my confirmed state
+  MDSMap::DaemonState want_state;    // the state i want
 
   list<Context*> waiting_for_active, waiting_for_replay, waiting_for_reconnect, waiting_for_resolve;
   list<Context*> replay_queue;
@@ -245,7 +245,7 @@ class MDS : public Dispatcher, public md_config_obs_t {
 
   bool is_stopped()  { return mdsmap->is_stopped(whoami); }
 
-  void request_state(int s);
+  void request_state(MDSMap::DaemonState s);
 
   ceph_tid_t issue_tid() { return ++last_tid; }
     
@@ -357,7 +357,7 @@ class MDS : public Dispatcher, public md_config_obs_t {
   }
 
   // start up, shutdown
-  int init(int wanted_state=MDSMap::STATE_BOOT);
+  int init(MDSMap::DaemonState wanted_state=MDSMap::STATE_BOOT);
 
   // admin socket handling
   friend class MDSSocketHook;
index 97b148b94ccd0b693ccec21de8d911b1a6dffe90..c015370fa7ffeea3c2d5300a47b42786310b0548 100644 (file)
@@ -365,7 +365,7 @@ void MDSMap::mds_info_t::encode_versioned(bufferlist& bl, uint64_t features) con
   ::encode(name, bl);
   ::encode(rank, bl);
   ::encode(inc, bl);
-  ::encode(state, bl);
+  ::encode((int32_t)state, bl);
   ::encode(state_seq, bl);
   ::encode(addr, bl);
   ::encode(laggy_since, bl);
@@ -383,7 +383,7 @@ void MDSMap::mds_info_t::encode_unversioned(bufferlist& bl) const
   ::encode(name, bl);
   ::encode(rank, bl);
   ::encode(inc, bl);
-  ::encode(state, bl);
+  ::encode((int32_t)state, bl);
   ::encode(state_seq, bl);
   ::encode(addr, bl);
   ::encode(laggy_since, bl);
@@ -399,7 +399,7 @@ void MDSMap::mds_info_t::decode(bufferlist::iterator& bl)
   ::decode(name, bl);
   ::decode(rank, bl);
   ::decode(inc, bl);
-  ::decode(state, bl);
+  ::decode((int32_t&)(state), bl);
   ::decode(state_seq, bl);
   ::decode(addr, bl);
   ::decode(laggy_since, bl);
index 6923fa3c425860930f4842f71f8d7fabdb0e09fa..77ffa04de63f758bfd4a61bfc993c7dd7d083b95 100644 (file)
@@ -75,29 +75,43 @@ extern CompatSet get_mdsmap_compat_set_base(); // pre v0.20
 
 class MDSMap {
 public:
-  // mds states
-  /*
-  static const int STATE_DNE =        CEPH_MDS_STATE_DNE;  // down, never existed.
-  static const int STATE_DESTROYING = CEPH_MDS_STATE_DESTROYING;  // down, existing, semi-destroyed.
-  static const int STATE_FAILED =     CEPH_MDS_STATE_FAILED;  // down, active subtrees; needs to be recovered.
-  */
-  static const int STATE_STOPPED =    CEPH_MDS_STATE_STOPPED;  // down, once existed, but no subtrees. empty log.
-  static const int STATE_BOOT     =   CEPH_MDS_STATE_BOOT;  // up, boot announcement.  destiny unknown.
-
-  static const int STATE_STANDBY  =   CEPH_MDS_STATE_STANDBY;  // up, idle.  waiting for assignment by monitor.
-  static const int STATE_STANDBY_REPLAY = CEPH_MDS_STATE_STANDBY_REPLAY;  // up, replaying active node; ready to take over.
-  static const int STATE_ONESHOT_REPLAY = CEPH_MDS_STATE_REPLAYONCE; //up, replaying active node journal to verify it, then shutting down
-
-  static const int STATE_CREATING  =  CEPH_MDS_STATE_CREATING;  // up, creating MDS instance (new journal, idalloc..).
-  static const int STATE_STARTING  =  CEPH_MDS_STATE_STARTING;  // up, starting prior stopped MDS instance.
-
-  static const int STATE_REPLAY    =  CEPH_MDS_STATE_REPLAY;  // up, starting prior failed instance. scanning journal.
-  static const int STATE_RESOLVE   =  CEPH_MDS_STATE_RESOLVE;  // up, disambiguating distributed operations (import, rename, etc.)
-  static const int STATE_RECONNECT =  CEPH_MDS_STATE_RECONNECT;  // up, reconnect to clients
-  static const int STATE_REJOIN    =  CEPH_MDS_STATE_REJOIN; // up, replayed journal, rejoining distributed cache
-  static const int STATE_CLIENTREPLAY = CEPH_MDS_STATE_CLIENTREPLAY; // up, active
-  static const int STATE_ACTIVE =     CEPH_MDS_STATE_ACTIVE; // up, active
-  static const int STATE_STOPPING  =  CEPH_MDS_STATE_STOPPING; // up, exporting metadata (-> standby or out)
+  /* These states are the union of the set of possible states of an MDS daemon,
+   * and the set of possible states of an MDS rank */
+  typedef enum {
+    // States of an MDS daemon not currently holding a rank
+    // ====================================================
+    STATE_NULL     =   0,                                  // null value for fns returning this type.
+    STATE_BOOT     =   CEPH_MDS_STATE_BOOT,                // up, boot announcement.  destiny unknown.
+    STATE_STANDBY  =   CEPH_MDS_STATE_STANDBY,             // up, idle.  waiting for assignment by monitor.
+    STATE_STANDBY_REPLAY = CEPH_MDS_STATE_STANDBY_REPLAY,  // up, replaying active node, ready to take over.
+
+    // States of an MDS rank, and of any MDS daemon holding that rank
+    // ==============================================================
+    STATE_STOPPED  =   CEPH_MDS_STATE_STOPPED,        // down, once existed, but no subtrees. empty log.  may not be held by a daemon.
+    STATE_ONESHOT_REPLAY = CEPH_MDS_STATE_REPLAYONCE, // up, replaying active node journal to verify it, then shutting down
+
+    STATE_CREATING  =  CEPH_MDS_STATE_CREATING,       // up, creating MDS instance (new journal, idalloc..).
+    STATE_STARTING  =  CEPH_MDS_STATE_STARTING,       // up, starting prior stopped MDS instance.
+
+    STATE_REPLAY    =  CEPH_MDS_STATE_REPLAY,         // up, starting prior failed instance. scanning journal.
+    STATE_RESOLVE   =  CEPH_MDS_STATE_RESOLVE,        // up, disambiguating distributed operations (import, rename, etc.)
+    STATE_RECONNECT =  CEPH_MDS_STATE_RECONNECT,      // up, reconnect to clients
+    STATE_REJOIN    =  CEPH_MDS_STATE_REJOIN,         // up, replayed journal, rejoining distributed cache
+    STATE_CLIENTREPLAY = CEPH_MDS_STATE_CLIENTREPLAY, // up, active
+    STATE_ACTIVE =     CEPH_MDS_STATE_ACTIVE,         // up, active
+    STATE_STOPPING  =  CEPH_MDS_STATE_STOPPING,       // up, exporting metadata (-> standby or out)
+    STATE_DNE       =  CEPH_MDS_STATE_DNE             // down, rank does not exist
+
+    /*
+     * In addition to explicit states, an MDS rank implicitly in state:
+     *  - STOPPED if it is not currently associated with an MDS daemon gid but it
+     *    is in MDSMap::stopped
+     *  - FAILED if it is not currently associated with an MDS daemon gid but it
+     *    is in MDSMap::failed
+     *  - DNE if it is not currently associated with an MDS daemon gid and it is
+     *    missing from both MDSMap::failed and MDSMap::stopped
+     */
+  } DaemonState;
 
   // indicate startup standby preferences for MDS
   // of course, if they have a specific rank to follow, they just set that!
@@ -114,7 +128,7 @@ public:
     string name;
     int32_t rank;
     int32_t inc;
-    int32_t state;
+    MDSMap::DaemonState state;
     version_t state_seq;
     entity_addr_t addr;
     utime_t laggy_since;
@@ -347,7 +361,7 @@ public:
       if (p->second.state >= STATE_CLIENTREPLAY && p->second.state <= STATE_STOPPING)
        s.insert(p->second.rank);
   }
-  void get_mds_set(set<int>& s, int state) {
+  void get_mds_set(set<int>& s, DaemonState state) {
     for (map<uint64_t,mds_info_t>::const_iterator p = mds_info.begin();
         p != mds_info.end();
         ++p)
@@ -432,16 +446,23 @@ public:
   bool is_dne(int m) const      { return in.count(m) == 0; }
   bool is_dne_gid(uint64_t gid) const     { return mds_info.count(gid) == 0; }
 
-  int get_state(int m) const {
+  /**
+   * Get MDS rank state if the rank is up, else STATE_NULL
+   */
+  DaemonState get_state(int m) const {
     map<int32_t,uint64_t>::const_iterator u = up.find(m);
     if (u == up.end())
-      return 0;
+      return STATE_NULL;
     return get_state_gid(u->second);
   }
-  int get_state_gid(uint64_t gid) const {
+
+  /**
+   * Get MDS daemon status by GID
+   */
+  DaemonState get_state_gid(uint64_t gid) const {
     map<uint64_t,mds_info_t>::const_iterator i = mds_info.find(gid);
     if (i == mds_info.end())
-      return 0;
+      return STATE_NULL;
     return i->second.state;
   }
 
index 64d442bf958fe31fa51a78750eab03940f24e0fb..40aa73e6d36769115c87aefaf90eacb60e6a0a42 100644 (file)
@@ -31,7 +31,7 @@ class MMDSBeacon : public PaxosServiceMessage {
   uint64_t global_id;
   string name;
 
-  __u32 state;
+  MDSMap::DaemonState state;
   version_t seq;
   __s32 standby_for_rank;
   string standby_for_name;
@@ -40,7 +40,7 @@ class MMDSBeacon : public PaxosServiceMessage {
 
  public:
   MMDSBeacon() : PaxosServiceMessage(MSG_MDS_BEACON, 0, HEAD_VERSION) { }
-  MMDSBeacon(const uuid_d &f, uint64_t g, string& n, epoch_t les, int st, version_t se) : 
+  MMDSBeacon(const uuid_d &f, uint64_t g, string& n, epoch_t les, MDSMap::DaemonState st, version_t se) : 
     PaxosServiceMessage(MSG_MDS_BEACON, les, HEAD_VERSION), 
     fsid(f), global_id(g), name(n), state(st), seq(se),
     standby_for_rank(-1) {
@@ -53,7 +53,7 @@ public:
   uint64_t get_global_id() { return global_id; }
   string& get_name() { return name; }
   epoch_t get_last_epoch_seen() { return version; }
-  int get_state() { return state; }
+  MDSMap::DaemonState get_state() { return state; }
   version_t get_seq() { return seq; }
   const char *get_type_name() const { return "mdsbeacon"; }
   int get_standby_for_rank() { return standby_for_rank; }
@@ -75,7 +75,7 @@ public:
     paxos_encode();
     ::encode(fsid, payload);
     ::encode(global_id, payload);
-    ::encode(state, payload);
+    ::encode((__u32)state, payload);
     ::encode(seq, payload);
     ::encode(name, payload);
     ::encode(standby_for_rank, payload);
@@ -87,7 +87,7 @@ public:
     paxos_decode(p);
     ::decode(fsid, p);
     ::decode(global_id, p);
-    ::decode(state, p);
+    ::decode((__u32&)state, p);
     ::decode(seq, p);
     ::decode(name, p);
     ::decode(standby_for_rank, p);
index eed77913f41fc1d153e8c2b0ce9353262e0fadcb..70180bc1068d03a33e3bcf2490922d7533241142 100644 (file)
@@ -201,7 +201,7 @@ void MDSMonitor::_note_beacon(MMDSBeacon *m)
 
 bool MDSMonitor::preprocess_beacon(MMDSBeacon *m)
 {
-  int state = m->get_state();
+  MDSMap::DaemonState state = m->get_state();
   uint64_t gid = m->get_global_id();
   version_t seq = m->get_seq();
   MDSMap::mds_info_t info;
@@ -377,7 +377,7 @@ bool MDSMonitor::prepare_beacon(MMDSBeacon *m)
   dout(12) << "prepare_beacon " << *m << " from " << m->get_orig_source_inst() << dendl;
   entity_addr_t addr = m->get_orig_source_inst().addr;
   uint64_t gid = m->get_global_id();
-  int state = m->get_state();
+  MDSMap::DaemonState state = m->get_state();
   version_t seq = m->get_seq();
 
   // Ignore beacons if filesystem is disabled
@@ -1261,7 +1261,7 @@ bool MDSMonitor::filesystem_command(
       r = -EINVAL;
       return true;
     }
-    int64_t state;
+    int32_t state;
     if (!cmd_getval(g_ceph_context, cmdmap, "state", state)) {
       ss << "error parsing 'state' string value '"
          << cmd_vartype_stringify(cmdmap["state"]) << "'";
@@ -1270,7 +1270,7 @@ bool MDSMonitor::filesystem_command(
     }
     if (!pending_mdsmap.is_dne_gid(gid)) {
       MDSMap::mds_info_t& info = pending_mdsmap.get_info_gid(gid);
-      info.state = state;
+      info.state = MDSMap::DaemonState(state);
       stringstream ss;
       ss << "set mds gid " << gid << " to state " << state << " " << ceph_mds_state_name(state);
       r = 0;