From b9eec41dde00f640e5f2a1ee1f61e19028bc69ba Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Tue, 2 Nov 2021 00:38:50 +0000 Subject: [PATCH] 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) --- src/mds/MDSRank.cc | 5 +++-- src/mon/OSDMonitor.cc | 6 +++++- src/osd/OSD.cc | 14 +++++++++++++- src/osd/OSDMap.cc | 11 +++++++++-- src/osd/OSDMap.h | 6 ++++-- src/osdc/Objecter.cc | 10 ++++++++-- 6 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index e4a59b473470d..585eb69cb6654 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 8ce12fd3c068d..8dba16550cf85 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 834ae6c47bf92..bb7f23954e8f7 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 994a7184d5dac..1c584cb1da5c9 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 9630e66d5b1df..e84bdede64362 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 da25c584f7974..6fb200eb1d010 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()); } -- 2.39.5