]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: verify fsid during probe and election
authorSage Weil <sage@newdream.net>
Fri, 11 Nov 2011 20:37:07 +0000 (12:37 -0800)
committerSage Weil <sage@newdream.net>
Fri, 11 Nov 2011 20:37:07 +0000 (12:37 -0800)
This will keep mismatched fsids out of the same quorum.

Signed-off-by: Sage Weil <sage@newdream.net>
src/messages/MMonElection.h
src/messages/MMonProbe.h
src/mon/Elector.cc
src/mon/Monitor.cc

index 6ca0159ebafb543df1ccbed5b4f9aa7209fb58e7..b7ceb74492066f81a1c5cc2fdcdf88867d9fcaf5 100644 (file)
@@ -35,6 +35,7 @@ public:
     }
   }
   
+  ceph_fsid_t fsid;
   int32_t op;
   epoch_t epoch;
   bufferlist monmap_bl;
@@ -43,7 +44,7 @@ public:
   MMonElection() : Message(MSG_MON_ELECTION) {}
   MMonElection(int o, epoch_t e, MonMap *m) : 
     Message(MSG_MON_ELECTION), 
-    op(o), epoch(e) {
+    fsid(m->fsid), op(o), epoch(e) {
     m->encode(monmap_bl);
   }
 private:
@@ -52,10 +53,12 @@ private:
 public:  
   const char *get_type_name() { return "election"; }
   void print(ostream& out) {
-    out << "election(" << get_opname(op) << " " << epoch << ")";
+    out << "election(" << fsid << " " << get_opname(op) << " " << epoch << ")";
   }
   
   void encode_payload(CephContext *cct) {
+    header.version = 2;
+    ::encode(fsid, payload);
     ::encode(op, payload);
     ::encode(epoch, payload);
     ::encode(monmap_bl, payload);
@@ -63,6 +66,10 @@ public:
   }
   void decode_payload(CephContext *cct) {
     bufferlist::iterator p = payload.begin();
+    if (header.version >= 2)
+      ::decode(fsid, p);
+    else
+      memset(&fsid, 0, sizeof(fsid));
     ::decode(op, p);
     ::decode(epoch, p);
     ::decode(monmap_bl, p);
index c3f1f8125411ac20bed13e753576d8efc1327cc4..c8fa9388acb91d9555820ed6190de7886d24da3a 100644 (file)
@@ -40,6 +40,7 @@ public:
     }
   }
   
+  ceph_fsid_t fsid;
   int32_t op;
   string name;
   set<int32_t> quorum;
@@ -52,8 +53,8 @@ public:
   version_t latest_version, newest_version, oldest_version;
 
   MMonProbe() : Message(MSG_MON_PROBE) {}
-  MMonProbe(int o, const string& n)
-    : Message(MSG_MON_PROBE), op(o), name(n),
+  MMonProbe(const ceph_fsid_t& f, int o, const string& n)
+    : Message(MSG_MON_PROBE), fsid(f), op(o), name(n),
       latest_version(0), newest_version(0), oldest_version(0) {}
 private:
   ~MMonProbe() {}
@@ -61,7 +62,7 @@ private:
 public:  
   const char *get_type_name() { return "mon_probe"; }
   void print(ostream& out) {
-    out << "mon_probe(" << get_opname(op) << " name " << name;
+    out << "mon_probe(" << get_opname(op) << " " << fsid << " name " << name;
     if (quorum.size())
       out << " quorum " << quorum;
     if (paxos_versions.size())
@@ -72,6 +73,7 @@ public:
   }
   
   void encode_payload(CephContext *cct) {
+    ::encode(fsid, payload);
     ::encode(op, payload);
     ::encode(name, payload);
     ::encode(quorum, payload);
@@ -86,6 +88,7 @@ public:
   }
   void decode_payload(CephContext *cct) {
     bufferlist::iterator p = payload.begin();
+    ::decode(fsid, p);
     ::decode(op, p);
     ::decode(name, p);
     ::decode(quorum, p);
index 62e44bb42becc4a4395fe4e7372d985f377fb966..4bdf3622b5cf337681bb93b07ff4121df12d5b4e 100644 (file)
@@ -285,6 +285,13 @@ void Elector::dispatch(Message *m)
     {
       MMonElection *em = (MMonElection*)m;
 
+      // assume an old message encoding would have matched
+      if (em->get_header().version >= 2 && ceph_fsid_compare(&em->fsid, &mon->monmap->fsid)) {
+       dout(0) << " ignoring election msg fsid " << em->fsid << " != " << mon->monmap->fsid << dendl;
+       m->put();
+       return;
+      }
+
       MonMap *peermap = new MonMap;
       peermap->decode(em->monmap_bl);
       if (peermap->epoch > mon->monmap->epoch) {
index 2f62755838d6450f88fbfc3acc6349aae3b0ac3f..4d1692b8fcc34010f8bf23ba04544ed158d35c60 100644 (file)
@@ -256,7 +256,7 @@ 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(MMonProbe::OP_PROBE, name), monmap->get_inst(i));
+      messenger->send_message(new MMonProbe(monmap->fsid, MMonProbe::OP_PROBE, name), monmap->get_inst(i));
   }
 }
 
@@ -306,6 +306,13 @@ void Monitor::probe_timeout(int r)
 void Monitor::handle_probe(MMonProbe *m)
 {
   dout(10) << "handle_probe " << *m << dendl;
+
+  if (ceph_fsid_compare(&m->fsid, &monmap->fsid)) {
+    dout(0) << "handle_probe ignoring fsid " << m->fsid << " != " << monmap->fsid << dendl;
+    m->put();
+    return;
+  }
+
   switch (m->op) {
   case MMonProbe::OP_PROBE:
     handle_probe_probe(m);
@@ -335,7 +342,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(MMonProbe::OP_REPLY, name);
+  MMonProbe *r = new MMonProbe(monmap->fsid, MMonProbe::OP_REPLY, name);
   r->name = name;
   r->quorum = quorum;
   monmap->encode(r->monmap_bl);
@@ -449,7 +456,7 @@ void Monitor::slurp()
     }
     dout(10) << " " << p->first << " v " << p->second << " vs my " << pax->get_version() << dendl;
     if (p->second > pax->get_version()) {
-      MMonProbe *m = new MMonProbe(MMonProbe::OP_SLURP, name);
+      MMonProbe *m = new MMonProbe(monmap->fsid, MMonProbe::OP_SLURP, name);
       m->machine_name = p->first;
       m->oldest_version = pax->get_first_committed();
       m->newest_version = pax->get_version();
@@ -460,7 +467,7 @@ void Monitor::slurp()
     // latest?
     if (pax->get_first_committed() > 1 &&   // don't need it!
        pax->get_latest_version() < pax->get_first_committed()) {
-      MMonProbe *m = new MMonProbe(MMonProbe::OP_SLURP_LATEST, name);
+      MMonProbe *m = new MMonProbe(monmap->fsid, MMonProbe::OP_SLURP_LATEST, name);
       m->machine_name = p->first;
       m->oldest_version = pax->get_first_committed();
       m->newest_version = pax->get_version();
@@ -482,7 +489,7 @@ void Monitor::handle_probe_slurp(MMonProbe *m)
   Paxos *pax = get_paxos_by_name(m->machine_name);
   assert(pax);
 
-  MMonProbe *r = new MMonProbe(MMonProbe::OP_DATA, name);
+  MMonProbe *r = new MMonProbe(monmap->fsid, MMonProbe::OP_DATA, name);
   r->machine_name = m->machine_name;
   r->oldest_version = pax->get_first_committed();
   r->newest_version = pax->get_version();
@@ -512,7 +519,7 @@ void Monitor::handle_probe_slurp_latest(MMonProbe *m)
   Paxos *pax = get_paxos_by_name(m->machine_name);
   assert(pax);
 
-  MMonProbe *r = new MMonProbe(MMonProbe::OP_DATA, name);
+  MMonProbe *r = new MMonProbe(monmap->fsid, MMonProbe::OP_DATA, name);
   r->machine_name = m->machine_name;
   r->oldest_version = pax->get_first_committed();
   r->newest_version = pax->get_version();