]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: revamp monitor states
authorSage Weil <sage@newdream.net>
Wed, 2 Nov 2011 16:07:10 +0000 (09:07 -0700)
committerSage Weil <sage.weil@dreamhost.com>
Tue, 8 Nov 2011 04:40:44 +0000 (20:40 -0800)
starting -> probing, electing
some cleanup

Signed-off-by: Sage Weil <sage@newdream.net>
src/mon/AuthMonitor.cc
src/mon/Elector.cc
src/mon/LogMonitor.cc
src/mon/MDSMonitor.cc
src/mon/Monitor.cc
src/mon/Monitor.h
src/mon/MonmapMonitor.cc
src/mon/OSDMonitor.cc
src/mon/PGMonitor.cc
src/mon/Paxos.cc
src/mon/PaxosService.cc

index 6b5bd8ae00f6f1afa3748615987cf6e0c90c4d48..ff9db8d4b26e921fc1c30dac9d62d19e908f0370 100644 (file)
@@ -39,8 +39,8 @@
 #define dout_prefix _prefix(_dout, mon, paxos->get_version())
 static ostream& _prefix(std::ostream *_dout, Monitor *mon, version_t v) {
   return *_dout << "mon." << mon->name << "@" << mon->rank
-               << (mon->is_starting() ? (const char*)"(starting)":(mon->is_leader() ? (const char*)"(leader)":(mon->is_peon() ? (const char*)"(peon)":(const char*)"(?\?)")))
-               << ".auth v" << v << " ";
+               << "(" << mon->get_state_name()
+               << ").auth v" << v << " ";
 }
 
 ostream& operator<<(ostream& out, AuthMonitor& pm)
index 2fe9016a49fb5f915848b090a4fa3565fe515754..95c50112e2985a041d777285375f01490f3401c2 100644 (file)
@@ -27,8 +27,8 @@
 #define dout_prefix _prefix(_dout, mon, epoch)
 static ostream& _prefix(std::ostream *_dout, Monitor *mon, epoch_t epoch) {
   return *_dout << "mon." << mon->name << "@" << mon->rank
-               << (mon->is_starting() ? (const char*)"(starting)":(mon->is_leader() ? (const char*)"(leader)":(mon->is_peon() ? (const char*)"(peon)":(const char*)"(?\?)")))
-               << ".elector(" << epoch << ") ";
+               << "(" << mon->get_state_name()
+               << ").elector(" << epoch << ") ";
 }
 
 
index 2c8db1fa882f6e41f9fec48d8507eea8d34f855d..1794b582e2f7ef78026fe33eef7f81725ef67748 100644 (file)
@@ -34,8 +34,8 @@
 #define dout_prefix _prefix(_dout, mon, paxos->get_version())
 static ostream& _prefix(std::ostream *_dout, Monitor *mon, version_t v) {
   return *_dout << "mon." << mon->name << "@" << mon->rank
-               << (mon->is_starting() ? (const char*)"(starting)":(mon->is_leader() ? (const char*)"(leader)":(mon->is_peon() ? (const char*)"(peon)":(const char*)"(?\?)")))
-               << ".log v" << v << " ";
+               << "(" << mon->get_state_name()
+               << ").log v" << v << " ";
 }
 
 ostream& operator<<(ostream& out, LogMonitor& pm)
index 6b9fe470dc0d02827486a324e336b2cb1c428323..d4c4c145b106f6a325ac0e0bb4e750eea73b311a 100644 (file)
@@ -40,8 +40,8 @@
 #define dout_prefix _prefix(_dout, mon, mdsmap)
 static ostream& _prefix(std::ostream *_dout, Monitor *mon, MDSMap& mdsmap) {
   return *_dout << "mon." << mon->name << "@" << mon->rank
-               << (mon->is_starting() ? (const char*)"(starting)":(mon->is_leader() ? (const char*)"(leader)":(mon->is_peon() ? (const char*)"(peon)":(const char*)"(?\?)")))
-               << ".mds e" << mdsmap.get_epoch() << " ";
+               << "(" << mon->get_state_name()
+               << ").mds e" << mdsmap.get_epoch() << " ";
 }
 
 
index 7b0775edd9b85506e1b9d7358f2e2938302cd343..94e0247b0902bdb31a556e57994d83521d33f059 100644 (file)
 #define dout_prefix _prefix(_dout, this)
 static ostream& _prefix(std::ostream *_dout, Monitor *mon) {
   return *_dout << "mon." << mon->name << "@" << mon->rank
-               << (mon->is_starting() ?
-                   (const char*)"(starting)" : 
-                   (mon->is_leader() ?
-                    (const char*)"(leader)" :
-                    (mon->is_peon() ? 
-                     (const char*)"(peon)" : 
-                     (const char*)"(?\?)")))
-               << " e" << mon->monmap->get_epoch()
-               << " ";
+               << "(" << mon->get_state_name() << ") e" << mon->monmap->get_epoch() << " ";
 }
 
 CompatSet get_ceph_mon_feature_compat_set()
@@ -112,7 +104,7 @@ Monitor::Monitor(CephContext* cct_, string nm, MonitorStore *s, Messenger *m, Mo
   auth_supported(cct),
   store(s),
   
-  state(STATE_STARTING), stopping(false),
+  state(STATE_PROBING),
   
   elector(this),
   leader(0),
@@ -215,8 +207,11 @@ void Monitor::bootstrap()
 {
   dout(10) << "bootstrap" << dendl;
 
+  // note my rank
+  rank = monmap->get_rank(name);
+
   // reset
-  state = STATE_STARTING;
+  state = STATE_PROBING;
   leader_since = utime_t();
 
   for (vector<Paxos*>::iterator p = paxos.begin(); p != paxos.end(); p++)
@@ -230,11 +225,9 @@ void Monitor::bootstrap()
     return;
   }
 
-  rank = monmap->get_rank(name);
-  
-  clog.info() << "mon." << name << " calling new monitor election\n";
-
   // call a new election
+  state = STATE_ELECTING;
+  clog.info() << "mon." << name << " calling new monitor election\n";
   elector.call_election();
 }
 
@@ -688,7 +681,6 @@ void Monitor::send_command(const entity_inst_t& inst,
 void Monitor::stop_cluster()
 {
   dout(0) << "stop_cluster -- initiating shutdown" << dendl;
-  stopping = true;
   mdsmon()->do_stop();
 }
 
index 4285285cdef2539453d9f81cc9304d86ed8d05d8..b4f56be3382640880a2e6d748dc67743747a5ba6 100644 (file)
@@ -85,17 +85,32 @@ public:
 
   // -- monitor state --
 private:
-  const static int STATE_STARTING = 0; // electing
-  const static int STATE_LEADER =   1;
-  const static int STATE_PEON =     2;
+  enum {
+    STATE_PROBING = 1,
+    STATE_ELECTING,
+    STATE_LEADER,
+    STATE_PEON
+  };
   int state;
-  bool stopping;
 
 public:
-  bool is_starting() const { return state == STATE_STARTING; }
+  static const char *get_state_name(int s) {
+    switch (s) {
+    case STATE_PROBING: return "probing";
+    case STATE_ELECTING: return "electing";
+    case STATE_LEADER: return "leader";
+    case STATE_PEON: return "peon";
+    default: return "???";
+    }
+  }
+  const char *get_state_name() {
+    return get_state_name(state);
+  }
+
+  bool is_probing() const { return state == STATE_PROBING; }
+  bool is_electing() const { return state == STATE_ELECTING; }
   bool is_leader() const { return state == STATE_LEADER; }
   bool is_peon() const { return state == STATE_PEON; }
-  bool is_stopping() const { return stopping; }
 
   const utime_t &get_leader_since() const;
 
index ed933466c3cecd4b9901c474c77e214625fe3f4d..4dd730a93f2327704086b2dd5c7036cc069e5026 100644 (file)
@@ -31,8 +31,8 @@
 #define dout_prefix _prefix(_dout, mon)
 static ostream& _prefix(std::ostream *_dout, Monitor *mon) {
   return *_dout << "mon." << mon->name << "@" << mon->rank
-               << (mon->is_starting() ? (const char*)"(starting)":(mon->is_leader() ? (const char*)"(leader)":(mon->is_peon() ? (const char*)"(peon)":(const char*)"(?\?)")))
-               << ".monmap v" << mon->monmap->epoch << " ";
+               << "(" << mon->get_state_name()
+               << ").monmap v" << mon->monmap->epoch << " ";
 }
 
 void MonmapMonitor::create_initial(bufferlist& bl)
index 6154987252b16c3b6875ef746a31445a980eb467..5c8d81de240fad1e73d0e9d5503b6a9951449d31 100644 (file)
@@ -48,8 +48,8 @@
 #define dout_prefix _prefix(_dout, mon, osdmap)
 static ostream& _prefix(std::ostream *_dout, Monitor *mon, OSDMap& osdmap) {
   return *_dout << "mon." << mon->name << "@" << mon->rank
-               << (mon->is_starting() ? (const char*)"(starting)":(mon->is_leader() ? (const char*)"(leader)":(mon->is_peon() ? (const char*)"(peon)":(const char*)"(?\?)")))
-               << ".osd e" << osdmap.get_epoch() << " ";
+               << "(" << mon->get_state_name()
+               << ").osd e" << osdmap.get_epoch() << " ";
 }
 
 
index 56df2c3a4bc3cdb5490073cc8765eeee25642606..ec6ce398bef01f164933efa2c0c26e43a7c12219 100644 (file)
@@ -45,8 +45,8 @@
 #define dout_prefix _prefix(_dout, mon, pg_map)
 static ostream& _prefix(std::ostream *_dout, Monitor *mon, PGMap& pg_map) {
   return *_dout << "mon." << mon->name << "@" << mon->rank
-               << (mon->is_starting() ? (const char*)"(starting)":(mon->is_leader() ? (const char*)"(leader)":(mon->is_peon() ? (const char*)"(peon)":(const char*)"(?\?)")))
-               << ".pg v" << pg_map.version << " ";
+               << "(" << mon->get_state_name()
+               << ").pg v" << pg_map.version << " ";
 }
 
 class RatioMonitor : public md_config_obs_t {
index bc1467d6030e7ce6959e30ddbe91b4219628138a..885325b7990e1d2da640a31d2c1616673093105c 100644 (file)
@@ -28,12 +28,7 @@ static ostream& _prefix(std::ostream *_dout, Monitor *mon, const string& name, i
                        const char *machine_name, int state,
                        version_t first_committed, version_t last_committed) {
   return *_dout << "mon." << name << "@" << rank
-               << (mon->is_starting() ?
-                   (const char*)"(starting)" :
-                   (mon->is_leader() ?
-                    (const char*)"(leader)" : 
-                    (mon->is_peon() ?
-                     (const char*)"(peon)" : (const char*)"(?\?)"))) 
+               << "(" << mon->get_state_name() << ")"
                << ".paxos(" << machine_name << " " << Paxos::get_statename(state)
                << " c " << first_committed << ".." << last_committed
                << ") ";
@@ -825,7 +820,7 @@ void Paxos::restart()
 void Paxos::dispatch(PaxosServiceMessage *m)
 {
   // election in progress?
-  if (mon->is_starting()) {
+  if (!mon->is_leader() && !mon->is_peon()) {
     dout(5) << "election in progress, dropping " << *m << dendl;
     m->put();
     return;    
index 545542b3a1aced78c145fd0d7d411ccfecb5a495..4525ae4c5c225020523b45571300e10123b3f99c 100644 (file)
@@ -25,8 +25,8 @@
 #define dout_prefix _prefix(_dout, mon, paxos, paxos->machine_id)
 static ostream& _prefix(std::ostream *_dout, Monitor *mon, Paxos *paxos, int machine_id) {
   return *_dout << "mon." << mon->name << "@" << mon->rank
-               << (mon->is_starting() ? (const char*)"(starting)":(mon->is_leader() ? (const char*)"(leader)":(mon->is_peon() ? (const char*)"(peon)":(const char*)"(?\?)")))
-               << ".paxosservice(" << get_paxos_name(machine_id) << ") ";
+               << "(" << mon->get_state_name()
+               << ").paxosservice(" << get_paxos_name(machine_id) << ") ";
 }
 
 const char *PaxosService::get_machine_name()