]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/OSDMap: fix _raw_to_up_osds for EC pools
authorSage Weil <sage@inktank.com>
Tue, 11 Feb 2014 17:24:29 +0000 (09:24 -0800)
committerSage Weil <sage@inktank.com>
Wed, 12 Feb 2014 21:38:12 +0000 (13:38 -0800)
When filtering down OSDs out of the result set (i.e., raw -> up), we can
shift positions for replicated pools but need to preserve position for
EC pools.

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

index 92591cf08a86b84ff814e59936377977a818f63a..d48347facf14c8833813f28f7719e98fb614deaa 100644 (file)
@@ -1370,16 +1370,30 @@ int OSDMap::_pg_to_osds(const pg_pool_t& pool, pg_t pg,
 }
 
 // pg -> (up osd list)
-void OSDMap::_raw_to_up_osds(pg_t pg, const vector<int>& raw,
+void OSDMap::_raw_to_up_osds(const pg_pool_t& pool, const vector<int>& raw,
                              vector<int> *up, int *primary) const
 {
-  up->clear();
-  for (unsigned i=0; i<raw.size(); i++) {
-    if (!exists(raw[i]) || is_down(raw[i]))
-      continue;
-    up->push_back(raw[i]);
+  if (pool.can_shift_osds()) {
+    // shift left
+    up->clear();
+    for (unsigned i=0; i<raw.size(); i++) {
+      if (!exists(raw[i]) || is_down(raw[i]))
+       continue;
+      up->push_back(raw[i]);
+    }
+    *primary = (up->empty() ? -1 : up->front());
+  } else {
+    // set down/dne devices to NONE
+    *primary = -1;
+    up->resize(raw.size());
+    for (int i = raw.size() - 1; i >= 0; --i) {
+      if (!exists(raw[i]) || is_down(raw[i])) {
+       (*up)[i] = CRUSH_ITEM_NONE;
+      } else {
+       *primary = (*up)[i] = raw[i];
+      }
+    }
   }
-  *primary = (up->empty() ? -1 : up->front());
 }
   
 void OSDMap::_get_temp_osds(const pg_pool_t& pool, pg_t pg,
@@ -1426,7 +1440,7 @@ void OSDMap::pg_to_raw_up(pg_t pg, vector<int> *up, int *primary) const
   }
   vector<int> raw;
   _pg_to_osds(*pool, pg, &raw, primary);
-  _raw_to_up_osds(pg, raw, up, primary);
+  _raw_to_up_osds(*pool, raw, up, primary);
 }
   
 void OSDMap::_pg_to_up_acting_osds(pg_t pg, vector<int> *up, int *up_primary,
@@ -1450,7 +1464,7 @@ void OSDMap::_pg_to_up_acting_osds(pg_t pg, vector<int> *up, int *up_primary,
   int _up_primary;
   int _acting_primary;
   _pg_to_osds(*pool, pg, &raw, &_up_primary);
-  _raw_to_up_osds(pg, raw, &_up, &_up_primary);
+  _raw_to_up_osds(*pool, raw, &_up, &_up_primary);
   _get_temp_osds(*pool, pg, &_acting, &_acting_primary);
   if (_acting.empty())
     _acting = _up;
index 2658cf6b90e6efb7152d55c12cccd8f679a0be71..d2e0aaee3415078274d84948af0565e7867b7599 100644 (file)
@@ -559,7 +559,7 @@ private:
   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, const vector<int>& raw,
+  void _raw_to_up_osds(const pg_pool_t& pool, const vector<int>& raw,
                        vector<int> *up, int *primary) const;
 
   /**