]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: send updated monmap to its subscribers 11456/head
authorKefu Chai <kchai@redhat.com>
Thu, 13 Oct 2016 05:19:27 +0000 (13:19 +0800)
committerKefu Chai <kchai@redhat.com>
Thu, 13 Oct 2016 06:35:24 +0000 (14:35 +0800)
prior to this change, we sends monmap when serving the subscription
requests, but the updates are not sent to the subscribers anymore.
so we need to send latest monmap to subscribes and update the
subscription status accordingly when the monmap is updated.

http://tracker.ceph.com/issues/17558
Signed-off-by: Kefu Chai <kchai@redhat.com>
src/mon/Monitor.cc
src/mon/Monitor.h
src/mon/MonmapMonitor.cc
src/mon/MonmapMonitor.h

index 4a0c1ac3dfaf31af9da59e7fd122193a9b3e3596..c8177fd5881498416fbc6179440d174849c02c38 100644 (file)
@@ -4332,7 +4332,7 @@ void Monitor::handle_subscribe(MonOpRequestRef op)
        pgmon()->check_sub(s->sub_map["osd_pg_creates"]);
       }
     } else if (p->first == "monmap") {
-      check_sub(s->sub_map["monmap"]);
+      monmon()->check_sub(s->sub_map[p->first]);
     } else if (logmon()->sub_name_to_id(p->first) >= 0) {
       logmon()->check_sub(s->sub_map[p->first]);
     } else if (p->first == "mgrmap" || p->first == "mgrdigest") {
@@ -4430,32 +4430,6 @@ bool Monitor::ms_handle_refused(Connection *con)
   return false;
 }
 
-void Monitor::check_subs()
-{
-  string type = "monmap";
-  if (session_map.subs.count(type) == 0)
-    return;
-  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)
-{
-  dout(10) << "check_sub monmap next " << sub->next << " have " << monmap->get_epoch() << dendl;
-  if (sub->next <= monmap->get_epoch()) {
-    send_latest_monmap(sub->session->con.get());
-    if (sub->onetime)
-      session_map.remove_sub(sub);
-    else
-      sub->next = monmap->get_epoch() + 1;
-  }
-}
-
-
 // -----
 
 void Monitor::send_latest_monmap(Connection *con)
index a2beeade4a2e745bd56bcdbb94622b6a348ca729..49540f35ad0b7e2194b86b9c20b6dff743fa64d0 100644 (file)
@@ -667,9 +667,6 @@ public:
   MonSessionMap session_map;
   AdminSocketHook *admin_hook;
 
-  void check_subs();
-  void check_sub(Subscription *sub);
-
   void send_latest_monmap(Connection *con);
 
   // messages
index 3cd61a26ec51743cc372636101b57eab3902a641..a36679e4062e0c3220ff7aa111ea0e44cdb76738 100644 (file)
@@ -70,6 +70,8 @@ void MonmapMonitor::update_from_paxos(bool *need_bootstrap)
     t->erase("mkfs", "monmap");
     mon->store->apply_transaction(t);
   }
+
+  check_subs();
 }
 
 void MonmapMonitor::create_pending()
@@ -574,3 +576,29 @@ int MonmapMonitor::get_monmap(bufferlist &bl)
   }
   return 0;
 }
+
+void MonmapMonitor::check_subs()
+{
+  const string type = "monmap";
+  auto subs = mon->session_map.subs.find(type);
+  if (subs == mon->session_map.subs.end())
+    return;
+  for (auto sub : *subs->second) {
+    check_sub(sub);
+  }
+}
+
+void MonmapMonitor::check_sub(Subscription *sub)
+{
+  const auto epoch = mon->monmap->get_epoch();
+  dout(10) << __func__
+          << " monmap next " << sub->next
+          << " have " << epoch << dendl;
+  if (sub->next <= epoch) {
+    mon->send_latest_monmap(sub->session->con.get());
+    if (sub->onetime)
+      mon->session_map.remove_sub(sub);
+    else
+      sub->next = epoch + 1;
+  }
+}
index ecfbe1e1225941edc2c740871ea179e945e3db6e..42fd8afa9108a4eaea17a4c59a20e12f345e607f 100644 (file)
@@ -81,7 +81,12 @@ class MonmapMonitor : public PaxosService {
 
   void tick();
 
- private:
+  void check_sub(Subscription *sub);
+
+private:
+  void check_subs();
+
+private:
   bufferlist monmap_bl;
 };