From e1694d6e85694ee8750b2af211505b89b3d6f0c8 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Thu, 13 Oct 2016 13:19:27 +0800 Subject: [PATCH] mon: send updated monmap to its subscribers 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 (cherry picked from commit c2b348b12c47ba505f72228ae0ea9b1a1b674719) Conflicts: src/mon/Monitor.cc: resolve conflicts src/mon/MonmapMonitor.cc: remove C++11-ism --- src/mon/Monitor.cc | 28 +--------------------------- src/mon/Monitor.h | 3 --- src/mon/MonmapMonitor.cc | 31 +++++++++++++++++++++++++++++++ src/mon/MonmapMonitor.h | 7 ++++++- 4 files changed, 38 insertions(+), 31 deletions(-) diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index d499f0c298c..c5c5441db98 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -4136,7 +4136,7 @@ void Monitor::handle_subscribe(MMonSubscribe *m) 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]); } @@ -4227,32 +4227,6 @@ bool Monitor::ms_handle_reset(Connection *con) return true; } -void Monitor::check_subs() -{ - string type = "monmap"; - if (session_map.subs.count(type) == 0) - return; - xlist::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) diff --git a/src/mon/Monitor.h b/src/mon/Monitor.h index 89af554dc52..01df5d77006 100644 --- a/src/mon/Monitor.h +++ b/src/mon/Monitor.h @@ -651,9 +651,6 @@ public: MonSessionMap session_map; AdminSocketHook *admin_hook; - void check_subs(); - void check_sub(Subscription *sub); - void send_latest_monmap(Connection *con); // messages diff --git a/src/mon/MonmapMonitor.cc b/src/mon/MonmapMonitor.cc index c6b21cb47fc..f9a370cea89 100644 --- a/src/mon/MonmapMonitor.cc +++ b/src/mon/MonmapMonitor.cc @@ -76,6 +76,8 @@ void MonmapMonitor::update_from_paxos(bool *need_bootstrap) t->erase("mkfs", "monmap"); mon->store->apply_transaction(t); } + + check_subs(); } void MonmapMonitor::create_pending() @@ -502,3 +504,32 @@ int MonmapMonitor::get_monmap(MonMap &m) m.decode(monmap_bl); return 0; } + +void MonmapMonitor::check_subs() +{ + dout(10) << __func__ << dendl; + const string type = "monmap"; + if (mon->session_map.subs.count(type) == 0) + return; + xlist::iterator p = mon->session_map.subs[type]->begin(); + while (!p.end()) { + Subscription *sub = *p; + ++p; + check_sub(sub); + } +} + +void MonmapMonitor::check_sub(Subscription *sub) +{ + const epoch_t 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; + } +} diff --git a/src/mon/MonmapMonitor.h b/src/mon/MonmapMonitor.h index 22b51ad6455..6f1707806b0 100644 --- a/src/mon/MonmapMonitor.h +++ b/src/mon/MonmapMonitor.h @@ -81,7 +81,12 @@ class MonmapMonitor : public PaxosService { void tick(); - private: + void check_sub(Subscription *sub); + +private: + void check_subs(); + +private: bufferlist monmap_bl; }; -- 2.47.3