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: v17.2.1~15^2~15 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f7a97132dbfbe74f9f82cced47fb16abf6691a5a;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 645db184130b..1199a65397cf 100644 --- a/src/mds/MDSRank.cc +++ b/src/mds/MDSRank.cc @@ -1971,9 +1971,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 9eca33f51a37..7a38a3ae0c89 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -12686,10 +12686,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 c35ac0b52674..141326d45d63 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -2656,10 +2656,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"); @@ -2670,6 +2671,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 13444abe584e..3c4c8def648e 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()); }