#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)
#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 << ") ";
}
#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)
#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() << " ";
}
#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()
auth_supported(cct),
store(s),
- state(STATE_STARTING), stopping(false),
+ state(STATE_PROBING),
elector(this),
leader(0),
{
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++)
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();
}
void Monitor::stop_cluster()
{
dout(0) << "stop_cluster -- initiating shutdown" << dendl;
- stopping = true;
mdsmon()->do_stop();
}
// -- 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;
#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)
#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() << " ";
}
#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 {
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
<< ") ";
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;
#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()