]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osdmap: convert get_blocklist() to provide the entity/IP and range blocklists
authorGreg Farnum <gfarnum@redhat.com>
Tue, 2 Nov 2021 00:38:50 +0000 (00:38 +0000)
committerGreg Farnum <gfarnum@redhat.com>
Tue, 31 May 2022 23:18:16 +0000 (23:18 +0000)
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 <gfarnum@redhat.com>
(cherry picked from commit 9c5e21a685b58e4be0360279d9d22efd513edab2)

src/mds/MDSRank.cc
src/mon/OSDMonitor.cc
src/osd/OSD.cc
src/osd/OSDMap.cc
src/osd/OSDMap.h
src/osdc/Objecter.cc

index 645db184130b9fe41bda54a00f7f3f4a3c329d4a..1199a65397cf6ddd92b1f6c6d0ec4d19233dfcbf 100644 (file)
@@ -1971,9 +1971,10 @@ void MDSRank::reconnect_start()
   // into reconnect, so that we don't wait for them.
   objecter->enable_blocklist_events();
   std::set<entity_addr_t> blocklist;
+  std::set<entity_addr_t> 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();
   });
 
index 9eca33f51a37ff4b5fa669e4b27e95f4cf60c1f1..7a38a3ae0c895ce6c18b82d557893e4f4f9f593b 100644 (file)
@@ -12686,10 +12686,14 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op,
             prefix == "osd blacklist clear") {
     pending_inc.new_blocklist.clear();
     std::list<std::pair<entity_addr_t,utime_t > > blocklist;
-    osdmap.get_blocklist(&blocklist);
+    std::list<std::pair<entity_addr_t,utime_t > > 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,
index c35ac0b526746fd85d400f6d74a43e9eae9d7afe..141326d45d639841a521d5ecbaeb08c4b822a6d6 100644 (file)
@@ -2656,10 +2656,11 @@ will start to track new ops received afterwards.";
     f->close_section();
   } else if (prefix == "dump_blocklist") {
     list<pair<entity_addr_t,utime_t> > bl;
+    list<pair<entity_addr_t,utime_t> > rbl;
     OSDMapRef curmap = service.get_osdmap();
+    curmap->get_blocklist(&bl, &rbl);
 
     f->open_array_section("blocklist");
-    curmap->get_blocklist(&bl);
     for (list<pair<entity_addr_t,utime_t> >::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<pair<entity_addr_t,utime_t> >::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<obj_watch_item_t> watchers;
     // scan pg's
index 13444abe584e1401b36eac85678b7bd7641d0d8f..3c4c8def648e374324319b4892cf895f9c5e74d2 100644 (file)
@@ -1404,16 +1404,23 @@ bool OSDMap::is_blocklisted(const entity_addrvec_t& av) const
   return false;
 }
 
-void OSDMap::get_blocklist(list<pair<entity_addr_t,utime_t> > *bl) const
+void OSDMap::get_blocklist(list<pair<entity_addr_t,utime_t> > *bl,
+                          std::list<std::pair<entity_addr_t,utime_t> > *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<entity_addr_t> *bl) const
+void OSDMap::get_blocklist(std::set<entity_addr_t> *bl,
+                          std::set<entity_addr_t> *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)
index 3969a9ea90cdc2265c339531087b8b280971af9c..e078e59e9556f38156984fb2ab9726e5d1525faf 100644 (file)
@@ -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<std::pair<entity_addr_t,utime_t > > *bl) const;
-  void get_blocklist(std::set<entity_addr_t> *bl) const;
+  void get_blocklist(std::list<std::pair<entity_addr_t,utime_t > > *bl,
+                    std::list<std::pair<entity_addr_t,utime_t> > *rl) const;
+  void get_blocklist(std::set<entity_addr_t> *bl,
+                    std::set<entity_addr_t> *rl) const;
 
   std::string get_cluster_snapshot() const {
     if (cluster_snapshot_epoch == epoch)
index 0050489d663de965318bbb1779795d424951f425..708c12cc9e6ec631ed4e26fdbe7cda06ad33e538 100644 (file)
@@ -1426,14 +1426,20 @@ void Objecter::emit_blocklist_events(const OSDMap &old_osd_map,
 
   std::set<entity_addr_t> old_set;
   std::set<entity_addr_t> new_set;
+  std::set<entity_addr_t> old_range_set;
+  std::set<entity_addr_t> 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<entity_addr_t> 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());
 }