]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/OSDMap: do not shift result when removing nonexistent osds
authorSage Weil <sage@inktank.com>
Sat, 2 Nov 2013 23:07:05 +0000 (16:07 -0700)
committerSage Weil <sage@inktank.com>
Tue, 3 Dec 2013 22:41:25 +0000 (14:41 -0800)
If it is a replicated pool, remove and shift to the left.  For erasure
pools, replace nonexistent items with CRUSH_ITEM_NONE.

Signed-off-by: Sage Weil <sage@inktank.com>
src/osd/OSDMap.cc
src/osd/OSDMap.h
src/osd/osd_types.h

index 3ebd3165cc2dbcd1b33af41975b155baf183bbb2..baef187db9e54915806ea7dbe41b0233c1544de9 100644 (file)
@@ -1029,20 +1029,28 @@ ceph_object_layout OSDMap::make_object_layout(
   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;
+void OSDMap::_remove_nonexistent_osds(const pg_pool_t& pool,
+                                     vector<int>& osds) const
+{
+  if (pool.can_shift_osds()) {
+    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[i - removed] = osds[i];
+    if (removed)
+      osds.resize(osds.size() - removed);
+  } else {
+    for (vector<int>::iterator p = osds.begin(); p != osds.end(); ++p) {
+      if (!exists(*p))
+       *p = CRUSH_ITEM_NONE;
     }
   }
-  if (removed)
-    osds.resize(osds.size() - removed);
 }
 
 int OSDMap::_pg_to_osds(const pg_pool_t& pool, pg_t pg, vector<int>& osds) const
@@ -1056,7 +1064,7 @@ int OSDMap::_pg_to_osds(const pg_pool_t& pool, pg_t pg, vector<int>& osds) const
   if (ruleno >= 0)
     crush->do_rule(ruleno, pps, osds, size, osd_weight);
 
-  _remove_nonexistent_osds(osds);
+  _remove_nonexistent_osds(pool, osds);
 
   return osds.size();
 }
index 7b6cb1e6c9d4b3ae8d65d6d8e874a6909889a36e..a4e782c84cf904a3fc7e13888c977126dbbf7bf8 100644 (file)
@@ -489,7 +489,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;
+  void _remove_nonexistent_osds(const pg_pool_t& pool, vector<int>& osds) const;
 
   /// pg -> (up osd list)
   void _raw_to_up_osds(pg_t pg, vector<int>& raw, vector<int>& up) const;
index d90c60e7546fcfd2cee38e4b7c25c60ecce9efca..6e3111d1c436ea3a4f680ea252db62f806754e1f 100644 (file)
@@ -848,6 +848,18 @@ public:
   bool is_raid4() const { return get_type() == TYPE_RAID4; }
   bool is_erasure() const { return get_type() == TYPE_ERASURE; }
 
+  bool can_shift_osds() const {
+    switch (get_type()) {
+    case TYPE_REP:
+      return true;
+    case TYPE_RAID4:
+    case TYPE_ERASURE:
+      return false;
+    default:
+      assert(0 == "unhandled pool type");
+    }
+  }
+
   unsigned get_pg_num() const { return pg_num; }
   unsigned get_pgp_num() const { return pgp_num; }