From d20915741d985e080a723cd6563bc6f4a657276f Mon Sep 17 00:00:00 2001 From: John Spray Date: Mon, 18 Sep 2017 10:12:00 +0100 Subject: [PATCH] mgr: make pgmap_ready atomic to avoid taking lock Signed-off-by: John Spray --- src/mgr/DaemonServer.cc | 52 +++++++++++++++++++++++------------------ src/mgr/DaemonServer.h | 2 +- 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/src/mgr/DaemonServer.cc b/src/mgr/DaemonServer.cc index 77a5cedab8fbf..e384be395a62d 100644 --- a/src/mgr/DaemonServer.cc +++ b/src/mgr/DaemonServer.cc @@ -73,7 +73,8 @@ DaemonServer::DaemonServer(MonClient *monc_, g_conf->auth_supported.empty() ? g_conf->auth_cluster_required : g_conf->auth_supported), - lock("DaemonServer") + lock("DaemonServer"), + pgmap_ready(false) { g_conf->add_observer(this); } @@ -276,31 +277,36 @@ bool DaemonServer::ms_dispatch(Message *m) void DaemonServer::maybe_ready(int32_t osd_id) { - Mutex::Locker l(lock); + if (pgmap_ready.load()) { + // Fast path: we don't need to take lock because pgmap_ready + // is already set + } else { + Mutex::Locker l(lock); - if (!pgmap_ready && reported_osds.find(osd_id) == reported_osds.end()) { - dout(4) << "initial report from osd " << osd_id << dendl; - reported_osds.insert(osd_id); - std::set up_osds; + if (reported_osds.find(osd_id) == reported_osds.end()) { + dout(4) << "initial report from osd " << osd_id << dendl; + reported_osds.insert(osd_id); + std::set up_osds; - cluster_state.with_osdmap([&](const OSDMap& osdmap) { - osdmap.get_up_osds(up_osds); - }); - - std::set unreported_osds; - std::set_difference(up_osds.begin(), up_osds.end(), - reported_osds.begin(), reported_osds.end(), - std::inserter(unreported_osds, unreported_osds.begin())); + cluster_state.with_osdmap([&](const OSDMap& osdmap) { + osdmap.get_up_osds(up_osds); + }); - if (unreported_osds.size() == 0) { - dout(4) << "all osds have reported, sending PG state to mon" << dendl; - pgmap_ready = true; - reported_osds.clear(); - // Avoid waiting for next tick - send_report(); - } else { - dout(4) << "still waiting for " << unreported_osds.size() << " osds" - " to report in before PGMap is ready" << dendl; + std::set unreported_osds; + std::set_difference(up_osds.begin(), up_osds.end(), + reported_osds.begin(), reported_osds.end(), + std::inserter(unreported_osds, unreported_osds.begin())); + + if (unreported_osds.size() == 0) { + dout(4) << "all osds have reported, sending PG state to mon" << dendl; + pgmap_ready = true; + reported_osds.clear(); + // Avoid waiting for next tick + send_report(); + } else { + dout(4) << "still waiting for " << unreported_osds.size() << " osds" + " to report in before PGMap is ready" << dendl; + } } } } diff --git a/src/mgr/DaemonServer.h b/src/mgr/DaemonServer.h index d29e3752f8612..a3ac2cad6ddee 100644 --- a/src/mgr/DaemonServer.h +++ b/src/mgr/DaemonServer.h @@ -95,7 +95,7 @@ private: void _prune_pending_service_map(); utime_t started_at; - bool pgmap_ready = false; + std::atomic pgmap_ready; std::set reported_osds; void maybe_ready(int32_t osd_id); -- 2.47.3