From: Greg Farnum Date: Tue, 2 Nov 2021 00:38:50 +0000 (+0000) Subject: osdmap: convert get_blocklist() to provide the entity/IP and range blocklists X-Git-Tag: v16.2.11~543^2~15 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b9eec41dde00f640e5f2a1ee1f61e19028bc69ba;p=ceph.git osdmap: convert get_blocklist() to provide the entity/IP and range blocklists Providing a non-range-aware blocklist accessor would just be asking for trouble, so don't. The ugly part of this is how the Objecter is currently just throwing the range blocklist on the end of its own list. The in-tree callers are okay with this, and I'd like to look at removing the blocklist events API from librados entirely -- it exposes "OSD-only" state to clients and, as evidenced by this patch series, is not particularly stable. Signed-off-by: Greg Farnum (cherry picked from commit 9c5e21a685b58e4be0360279d9d22efd513edab2) --- diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index e4a59b47347..585eb69cb66 100644 --- a/src/mds/MDSRank.cc +++ b/src/mds/MDSRank.cc @@ -1965,9 +1965,10 @@ void MDSRank::reconnect_start() // into reconnect, so that we don't wait for them. objecter->enable_blocklist_events(); std::set blocklist; + std::set range; epoch_t epoch = 0; - objecter->with_osdmap([&blocklist, &epoch](const OSDMap& o) { - o.get_blocklist(&blocklist); + objecter->with_osdmap([&blocklist, &range, &epoch](const OSDMap& o) { + o.get_blocklist(&blocklist, &range); epoch = o.get_epoch(); }); diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 8ce12fd3c06..8dba16550cf 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -12682,10 +12682,14 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op, prefix == "osd blacklist clear") { pending_inc.new_blocklist.clear(); std::list > blocklist; - osdmap.get_blocklist(&blocklist); + std::list > range_b; + osdmap.get_blocklist(&blocklist, &range_b); for (const auto &entry : blocklist) { pending_inc.old_blocklist.push_back(entry.first); } + for (const auto &entry : range_b) { + pending_inc.old_range_blocklist.push_back(entry.first); + } ss << " removed all blocklist entries"; getline(ss, rs); wait_for_finished_proposal(op, new Monitor::C_Command(mon, op, 0, rs, diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 834ae6c47bf..bb7f23954e8 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -2668,10 +2668,11 @@ will start to track new ops received afterwards."; f->close_section(); } else if (prefix == "dump_blocklist") { list > bl; + list > rbl; OSDMapRef curmap = service.get_osdmap(); + curmap->get_blocklist(&bl, &rbl); f->open_array_section("blocklist"); - curmap->get_blocklist(&bl); for (list >::iterator it = bl.begin(); it != bl.end(); ++it) { f->open_object_section("entry"); @@ -2682,6 +2683,17 @@ will start to track new ops received afterwards."; f->close_section(); //entry } f->close_section(); //blocklist + f->open_array_section("range_blocklist"); + for (list >::iterator it = rbl.begin(); + it != rbl.end(); ++it) { + f->open_object_section("entry"); + f->open_object_section("entity_addr_t"); + it->first.dump(f); + f->close_section(); //entity_addr_t + it->second.localtime(f->dump_stream("expire_time")); + f->close_section(); //entry + } + f->close_section(); //blocklist } else if (prefix == "dump_watchers") { list watchers; // scan pg's diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc index 994a7184d5d..1c584cb1da5 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -1404,16 +1404,23 @@ bool OSDMap::is_blocklisted(const entity_addrvec_t& av) const return false; } -void OSDMap::get_blocklist(list > *bl) const +void OSDMap::get_blocklist(list > *bl, + std::list > *rl) const { std::copy(blocklist.begin(), blocklist.end(), std::back_inserter(*bl)); + std::copy(range_blocklist.begin(), range_blocklist.end(), + std::back_inserter(*rl)); } -void OSDMap::get_blocklist(std::set *bl) const +void OSDMap::get_blocklist(std::set *bl, + std::set *rl) const { for (const auto &i : blocklist) { bl->insert(i.first); } + for (const auto &i : range_blocklist) { + rl->insert(i.first); + } } void OSDMap::set_max_osd(int m) diff --git a/src/osd/OSDMap.h b/src/osd/OSDMap.h index 9630e66d5b1..e84bdede643 100644 --- a/src/osd/OSDMap.h +++ b/src/osd/OSDMap.h @@ -698,8 +698,10 @@ public: bool is_blocklisted(const entity_addr_t& a) const; bool is_blocklisted(const entity_addrvec_t& a) const; - void get_blocklist(std::list > *bl) const; - void get_blocklist(std::set *bl) const; + void get_blocklist(std::list > *bl, + std::list > *rl) const; + void get_blocklist(std::set *bl, + std::set *rl) const; std::string get_cluster_snapshot() const { if (cluster_snapshot_epoch == epoch) diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index da25c584f79..6fb200eb1d0 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -1408,14 +1408,20 @@ void Objecter::emit_blocklist_events(const OSDMap &old_osd_map, std::set old_set; std::set new_set; + std::set old_range_set; + std::set new_range_set; - old_osd_map.get_blocklist(&old_set); - new_osd_map.get_blocklist(&new_set); + old_osd_map.get_blocklist(&old_set, &old_range_set); + new_osd_map.get_blocklist(&new_set, &new_range_set); std::set delta_set; std::set_difference( new_set.begin(), new_set.end(), old_set.begin(), old_set.end(), std::inserter(delta_set, delta_set.begin())); + std::set_difference( + new_range_set.begin(), new_range_set.end(), + old_range_set.begin(), old_range_set.end(), + std::inserter(delta_set, delta_set.begin())); blocklist_events.insert(delta_set.begin(), delta_set.end()); }