]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: allow sub for monmap
authorSage Weil <sage@newdream.net>
Mon, 21 Sep 2009 21:45:45 +0000 (14:45 -0700)
committerSage Weil <sage@newdream.net>
Mon, 21 Sep 2009 21:45:45 +0000 (14:45 -0700)
src/mon/MonMap.h
src/mon/Monitor.cc
src/mon/Monitor.h

index ba63408bb4c4a7d9f2710f7f2e5f85a1ceca6d52..9313d9f0ec3b369f2ed607acdbfd224faaaac860 100644 (file)
@@ -39,6 +39,8 @@ class MonMap {
     return mon_inst.size();
   }
 
+  epoch_t get_epoch() { return epoch; }
+
   void add_mon(entity_inst_t inst) {
     mon_inst.push_back(inst);
   }
index 39a727f285f774bd6bb3847254e2dcaef0f019c1..c342286858f60fda98f20cf40fe31f32c1bfa544 100644 (file)
@@ -494,6 +494,8 @@ void Monitor::handle_subscribe(MMonSubscribe *m)
       mdsmon()->check_sub(s->sub_map["mdsmap"]);
     else if (p->first == "osdmap")
       osdmon()->check_sub(s->sub_map["osdmap"]);
+    else if (p->first == "monmap")
+      check_sub(s->sub_map["monmap"]);
   }
 
   // ???
@@ -518,12 +520,42 @@ bool Monitor::ms_handle_reset(Connection *con, const entity_addr_t& peer)
   return true;
 }
 
-void Monitor::handle_mon_get_map(MMonGetMap *m)
+void Monitor::check_subs()
+{
+  nstring type = "monmap";
+  xlist<Subscription*>::iterator p = session_map.subs[type].begin();
+  while (!p.end()) {
+    Subscription *sub = *p;
+    ++p;
+    check_sub(sub);
+  }
+}
+
+void Monitor::check_sub(Subscription *sub)
+{
+  if (sub->last < monmap->get_epoch()) {
+    send_latest_monmap(sub->session->inst);
+    if (sub->onetime)
+      session_map.remove_sub(sub);
+    else
+      sub->last = monmap->get_epoch();
+  }
+}
+
+
+// -----
+
+void Monitor::send_latest_monmap(entity_inst_t i)
 {
-  dout(10) << "handle_mon_get_map" << dendl;
   bufferlist bl;
   monmap->encode(bl);
-  messenger->send_message(new MMonMap(bl), m->get_orig_source_inst());
+  messenger->send_message(new MMonMap(bl), i);
+}
+
+void Monitor::handle_mon_get_map(MMonGetMap *m)
+{
+  dout(10) << "handle_mon_get_map" << dendl;
+  send_latest_monmap(m->get_orig_source_inst());
   delete m;
 }
 
index 96ee4f36f9e5665ddd79be59dbf9c6fc21c0d8fb..b770b47fa2a6f993dc2c9db3274a6e99b1e817eb 100644 (file)
@@ -131,6 +131,10 @@ public:
   // -- sessions --
   SessionMap session_map;
 
+  void check_subs();
+  void check_sub(Subscription *sub);
+
+  void send_latest_monmap(entity_inst_t i);
   
 
   // messages