From: Sage Weil Date: Sat, 2 Nov 2013 23:07:05 +0000 (-0700) Subject: osd/OSDMap: do not shift result when removing nonexistent osds X-Git-Tag: v0.74~16^2~16 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6dc68f4f55207667fd95a741c90bf62310c6001c;p=ceph.git osd/OSDMap: do not shift result when removing nonexistent osds 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 --- diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc index 3ebd3165cc2..baef187db9e 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -1029,20 +1029,28 @@ ceph_object_layout OSDMap::make_object_layout( return ol; } -void OSDMap::_remove_nonexistent_osds(vector& 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& 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::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& osds) const @@ -1056,7 +1064,7 @@ int OSDMap::_pg_to_osds(const pg_pool_t& pool, pg_t pg, vector& 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(); } diff --git a/src/osd/OSDMap.h b/src/osd/OSDMap.h index 7b6cb1e6c9d..a4e782c84cf 100644 --- a/src/osd/OSDMap.h +++ b/src/osd/OSDMap.h @@ -489,7 +489,7 @@ public: private: /// pg -> (raw osd list) int _pg_to_osds(const pg_pool_t& pool, pg_t pg, vector& osds) const; - void _remove_nonexistent_osds(vector& osds) const; + void _remove_nonexistent_osds(const pg_pool_t& pool, vector& osds) const; /// pg -> (up osd list) void _raw_to_up_osds(pg_t pg, vector& raw, vector& up) const; diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index d90c60e7546..6e3111d1c43 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -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; }