]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osdmap: filter out nonexistent osds from map
authorSage Weil <sage@inktank.com>
Sat, 12 May 2012 21:18:27 +0000 (14:18 -0700)
committerSage Weil <sage@inktank.com>
Sat, 12 May 2012 21:18:27 +0000 (14:18 -0700)
It is possible that the crush map contains device ids that do not exist as
osds.  Filter them out of the CRUSH result.

Signed-off-by: Sage Weil <sage@newdream.net>
src/osd/OSDMap.cc
src/osd/OSDMap.h

index 9ab699adccbf38ef2043f8edecfaa4f30c29c91e..0b5b45917ff4a2c054d549682f17c49cbfad060d 100644 (file)
@@ -816,6 +816,22 @@ ceph_object_layout OSDMap::make_object_layout(object_t oid, int pg_pool) const
   return ol;
 }
 
+void OSDMap::_remove_nonexistent_osds(vector<int>& osds) const
+{
+  unsigned removed = 0;
+  for (unsigned i = 0; i < osds.size(); i++) {
+    if (!exists(osds[i])) {
+      removed++;
+      continue;
+    }
+    if (removed) {
+      osds[i - removed] = osds[i];
+    }
+  }
+  if (removed)
+    osds.resize(osds.size() - removed);
+}
+
 int OSDMap::_pg_to_osds(const pg_pool_t& pool, pg_t pg, vector<int>& osds) const
 {
   // map to osds[]
@@ -826,7 +842,9 @@ int OSDMap::_pg_to_osds(const pg_pool_t& pool, pg_t pg, vector<int>& osds) const
   int ruleno = crush->find_rule(pool.get_crush_ruleset(), pool.get_type(), size);
   if (ruleno >= 0)
     crush->do_rule(ruleno, pps, osds, size, osd_weight);
-  
+
+  _remove_nonexistent_osds(osds);
+
   return osds.size();
 }
 
index 18dbf457976f6489a86779beaac01eb906a945dc..6db1bf4b0b9e5c4145f4d3511d318b856b545870 100644 (file)
@@ -405,6 +405,7 @@ public:
 private:
   /// pg -> (raw osd list)
   int _pg_to_osds(const pg_pool_t& pool, pg_t pg, vector<int>& osds) const;
+  void _remove_nonexistent_osds(vector<int>& osds) const;
 
   /// pg -> (up osd list)
   void _raw_to_up_osds(pg_t pg, vector<int>& raw, vector<int>& up) const;