]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: pass has_ever_joined in probe messages
authorSage Weil <sage@inktank.com>
Thu, 17 May 2012 18:07:45 +0000 (11:07 -0700)
committerSage Weil <sage@inktank.com>
Fri, 18 May 2012 23:23:55 +0000 (16:23 -0700)
This will allow monitors to behave appropriately with that important info..

Signed-off-by: Sage Weil <sage@inktank.com>
src/messages/MMonProbe.h
src/mon/Monitor.cc

index 62c1a1655e721f533eea7ce157fb360fbbee7c2b..72144ab0f1853adb09176599df6e5eb820c523a9 100644 (file)
@@ -21,6 +21,9 @@
 
 class MMonProbe : public Message {
 public:
+  static const int HEAD_VERSION = 2;
+  static const int COMPAT_VERSION = 1;
+
   enum {
     OP_PROBE = 1,
     OP_REPLY = 2,
@@ -46,15 +49,18 @@ public:
   set<int32_t> quorum;
   bufferlist monmap_bl;
   map<string, version_t> paxos_versions;
+  bool has_ever_joined;
 
   string machine_name;
   map<string, map<version_t,bufferlist> > paxos_values;
   bufferlist latest_value;
   version_t latest_version, newest_version, oldest_version;
 
-  MMonProbe() : Message(MSG_MON_PROBE) {}
-  MMonProbe(const uuid_d& f, int o, const string& n)
-    : Message(MSG_MON_PROBE), fsid(f), op(o), name(n),
+  MMonProbe()
+    : Message(MSG_MON_PROBE, HEAD_VERSION, COMPAT_VERSION) {}
+  MMonProbe(const uuid_d& f, int o, const string& n, bool hej)
+    : Message(MSG_MON_PROBE, HEAD_VERSION, COMPAT_VERSION),
+      fsid(f), op(o), name(n), has_ever_joined(hej),
       latest_version(0), newest_version(0), oldest_version(0) {}
 private:
   ~MMonProbe() {}
@@ -69,6 +75,8 @@ public:
       out << " versions " << paxos_versions;
     if (machine_name.length())
       out << " machine_name " << machine_name << " " << oldest_version << "-" << newest_version;
+    if (!has_ever_joined)
+      out << " new";
     out << ")";
   }
   
@@ -85,6 +93,7 @@ public:
     ::encode(paxos_values, payload);
     ::encode(latest_value, payload);
     ::encode(latest_version, payload);
+    ::encode(has_ever_joined, payload);
   }
   void decode_payload() {
     bufferlist::iterator p = payload.begin();
@@ -100,6 +109,10 @@ public:
     ::decode(paxos_values, p);
     ::decode(latest_value, p);
     ::decode(latest_version, p);
+    if (header.version >= 2)
+      ::decode(has_ever_joined, p);
+    else
+      has_ever_joined = false;
   }
 };
 
index b723d2ea56ec1b77ad9fa4fe612b68fe4c177acb..3172f5cc8296c649110c7af376c2961a011b0734 100644 (file)
@@ -281,6 +281,7 @@ int Monitor::init()
 
   // have we ever joined a quorum?
   has_ever_joined = store->exists_bl_ss("joined");
+  dout(10) << "has_ever_joined = " << (int)has_ever_joined << dendl;
 
   // init paxos
   for (int i = 0; i < PAXOS_NUM; ++i) {
@@ -458,7 +459,8 @@ void Monitor::bootstrap()
   dout(10) << "probing other monitors" << dendl;
   for (unsigned i = 0; i < monmap->size(); i++) {
     if ((int)i != rank)
-      messenger->send_message(new MMonProbe(monmap->fsid, MMonProbe::OP_PROBE, name), monmap->get_inst(i));
+      messenger->send_message(new MMonProbe(monmap->fsid, MMonProbe::OP_PROBE, name, has_ever_joined),
+                             monmap->get_inst(i));
   }
 }
 
@@ -547,7 +549,7 @@ void Monitor::handle_probe(MMonProbe *m)
 void Monitor::handle_probe_probe(MMonProbe *m)
 {
   dout(10) << "handle_probe_probe " << m->get_source_inst() << *m << dendl;
-  MMonProbe *r = new MMonProbe(monmap->fsid, MMonProbe::OP_REPLY, name);
+  MMonProbe *r = new MMonProbe(monmap->fsid, MMonProbe::OP_REPLY, name, has_ever_joined);
   r->name = name;
   r->quorum = quorum;
   monmap->encode(r->monmap_bl, m->get_connection()->get_features());
@@ -686,7 +688,7 @@ void Monitor::slurp()
       if (!pax->is_slurping()) {
         pax->start_slurping();
       }
-      MMonProbe *m = new MMonProbe(monmap->fsid, MMonProbe::OP_SLURP, name);
+      MMonProbe *m = new MMonProbe(monmap->fsid, MMonProbe::OP_SLURP, name, has_ever_joined);
       m->machine_name = p->first;
       m->oldest_version = pax->get_first_committed();
       m->newest_version = pax->get_version();
@@ -700,7 +702,7 @@ void Monitor::slurp()
       if (!pax->is_slurping()) {
         pax->start_slurping();
       }
-      MMonProbe *m = new MMonProbe(monmap->fsid, MMonProbe::OP_SLURP_LATEST, name);
+      MMonProbe *m = new MMonProbe(monmap->fsid, MMonProbe::OP_SLURP_LATEST, name, has_ever_joined);
       m->machine_name = p->first;
       m->oldest_version = pax->get_first_committed();
       m->newest_version = pax->get_version();
@@ -723,7 +725,7 @@ void Monitor::slurp()
 
 MMonProbe *Monitor::fill_probe_data(MMonProbe *m, Paxos *pax)
 {
-  MMonProbe *r = new MMonProbe(monmap->fsid, MMonProbe::OP_DATA, name);
+  MMonProbe *r = new MMonProbe(monmap->fsid, MMonProbe::OP_DATA, name, has_ever_joined);
   r->machine_name = m->machine_name;
   r->oldest_version = pax->get_first_committed();
   r->newest_version = pax->get_version();