]> 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>
Wed, 13 Apr 2022 00:14:16 +0000 (00:14 +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>
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 5bfafacc34f45ef639006259548ab835931ae177..0b9b8e7f9daade80e294e44338112a62fa3134fd 100644 (file)
@@ -1970,9 +1970,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 9443c708c57fb15c1a16c3f682db51d676df7731..39f8ba3d2e030ecbcee1f52cd223b28c20bfd089 100644 (file)
@@ -12685,10 +12685,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 16045c77af98626cf0b757372bfec76d7dc4485b..6c437312e05ed5fe904726742f58408c354fb7d1 100644 (file)
@@ -2664,10 +2664,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");
@@ -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<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 e9762825eb2e6012377bbc7ade0e6d2f7245ffba..ca2c1aa6e8dbf5911adccea7083d0b419f4dd2c0 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());
 }