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: v18.0.0~1026^2~12 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=9c5e21a685b58e4be0360279d9d22efd513edab2;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 --- diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index 5bfafacc34f4..0b9b8e7f9daa 100644 --- a/src/mds/MDSRank.cc +++ b/src/mds/MDSRank.cc @@ -1970,9 +1970,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 9443c708c57f..39f8ba3d2e03 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -12685,10 +12685,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 16045c77af98..6c437312e05e 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -2664,10 +2664,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"); @@ -2678,6 +2679,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 e9762825eb2e..ca2c1aa6e8db 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 3969a9ea90cd..e078e59e9556 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 0050489d663d..708c12cc9e6e 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -1426,14 +1426,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()); }