From: Sage Weil Date: Tue, 11 Feb 2014 17:24:29 +0000 (-0800) Subject: osd/OSDMap: fix _raw_to_up_osds for EC pools X-Git-Tag: v0.78~173^2~7 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e10793827217b780ed9d14af70d17a76fb8e4d67;p=ceph.git osd/OSDMap: fix _raw_to_up_osds for EC pools 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 --- diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc index 92591cf08a8..d48347facf1 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -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& raw, +void OSDMap::_raw_to_up_osds(const pg_pool_t& pool, const vector& raw, vector *up, int *primary) const { - up->clear(); - for (unsigned i=0; ipush_back(raw[i]); + if (pool.can_shift_osds()) { + // shift left + up->clear(); + for (unsigned i=0; ipush_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 *up, int *primary) const } vector 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 *up, int *up_primary, @@ -1450,7 +1464,7 @@ void OSDMap::_pg_to_up_acting_osds(pg_t pg, vector *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; diff --git a/src/osd/OSDMap.h b/src/osd/OSDMap.h index 2658cf6b90e..d2e0aaee341 100644 --- a/src/osd/OSDMap.h +++ b/src/osd/OSDMap.h @@ -559,7 +559,7 @@ private: void _remove_nonexistent_osds(const pg_pool_t& pool, vector& osds) const; /// pg -> (up osd list) - void _raw_to_up_osds(pg_t pg, const vector& raw, + void _raw_to_up_osds(const pg_pool_t& pool, const vector& raw, vector *up, int *primary) const; /**