From: Greg Farnum Date: Fri, 20 Dec 2013 22:43:03 +0000 (-0800) Subject: OSDMap: add primary out params to _pg_to_osds and _raw_to_up_osds X-Git-Tag: v0.78~329^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=12122b11c7f79df90973d3f784b3f9d8f8b07c3d;p=ceph.git OSDMap: add primary out params to _pg_to_osds and _raw_to_up_osds Switch to use pointers for the out parameters instead of references. These functions are still just pointing at the front of the generated lists for the "primary" params, but now that all their callers respect these outputs we can add programmatic leader assignment with just these two functions. Signed-off-by: Greg Farnum --- diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc index ced6a8f696ff..f5f4ce916d35 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -1259,7 +1259,8 @@ void OSDMap::_remove_nonexistent_osds(const pg_pool_t& pool, } } -int OSDMap::_pg_to_osds(const pg_pool_t& pool, pg_t pg, vector& osds) const +int OSDMap::_pg_to_osds(const pg_pool_t& pool, pg_t pg, + vector *osds, int *primary) const { // map to osds[] ps_t pps = pool.raw_pg_to_pps(pg); // placement ps @@ -1268,22 +1269,26 @@ int OSDMap::_pg_to_osds(const pg_pool_t& pool, pg_t pg, vector& osds) const // what crush rule? 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); + crush->do_rule(ruleno, pps, *osds, size, osd_weight); - _remove_nonexistent_osds(pool, osds); + _remove_nonexistent_osds(pool, *osds); - return osds.size(); + *primary = (osds->empty() ? -1 : osds->front()); + + return osds->size(); } // pg -> (up osd list) -void OSDMap::_raw_to_up_osds(pg_t pg, vector& raw, vector& up) const +void OSDMap::_raw_to_up_osds(pg_t pg, const vector& raw, + vector *up, int *primary) const { - up.clear(); + up->clear(); for (unsigned i=0; ipush_back(raw[i]); } + *primary = (up->empty() ? -1 : up->front()); } bool OSDMap::_get_temp_osds(const pg_pool_t& pool, pg_t pg, vector& temp) const @@ -1308,8 +1313,7 @@ int OSDMap::pg_to_osds(pg_t pg, vector *raw, int *primary) const const pg_pool_t *pool = get_pg_pool(pg.pool()); if (!pool) return 0; - int r = _pg_to_osds(*pool, pg, *raw); - *primary = (raw->empty() ? -1 : raw->front()); + int r = _pg_to_osds(*pool, pg, raw, primary); return r; } @@ -1319,9 +1323,8 @@ void OSDMap::pg_to_raw_up(pg_t pg, vector *up, int *primary) const if (!pool) return; vector raw; - _pg_to_osds(*pool, pg, raw); - _raw_to_up_osds(pg, raw, *up); - *primary = (up->empty() ? -1 : up->front()); + _pg_to_osds(*pool, pg, &raw, primary); + _raw_to_up_osds(pg, raw, up, primary); } void OSDMap::_pg_to_up_acting_osds(pg_t pg, vector *up, int *up_primary, @@ -1332,16 +1335,17 @@ void OSDMap::_pg_to_up_acting_osds(pg_t pg, vector *up, int *up_primary, return; vector raw; vector *_up = (up ? up : new vector); - _pg_to_osds(*pool, pg, *raw); - _raw_to_up_osds(pg, raw, *_up); - if (up_primary) - *up_primary = (_up->empty() ? -1 : _up->front()); + int *_up_primary = (up_primary ? up_primary : new int); + _pg_to_osds(*pool, pg, &raw, _up_primary); + _raw_to_up_osds(pg, raw, _up, _up_primary); if (acting && !_get_temp_osds(*pool, pg, *acting)) *acting = *_up; if (acting_primary) *acting_primary = (acting->empty() ? -1 : acting->front()); if (_up != up) delete _up; + if (_up_primary != up_primary) + delete _up_primary; } int OSDMap::calc_pg_rank(int osd, vector& acting, int nrep) diff --git a/src/osd/OSDMap.h b/src/osd/OSDMap.h index 580a3af5aa47..95d7e0f1c229 100644 --- a/src/osd/OSDMap.h +++ b/src/osd/OSDMap.h @@ -505,11 +505,13 @@ public: private: /// pg -> (raw osd list) - int _pg_to_osds(const pg_pool_t& pool, pg_t pg, vector& osds) const; + int _pg_to_osds(const pg_pool_t& pool, pg_t pg, + vector *osds, int *primary) 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; + void _raw_to_up_osds(pg_t pg, const vector& raw, + vector *up, int *primary) const; bool _get_temp_osds(const pg_pool_t& pool, pg_t pg, vector& temp) const;