*primary = (up->empty() ? -1 : up->front());
}
-void OSDMap::_pg_to_up_acting_osds(pg_t pg, vector<int> *up, vector<int>& acting) const
+void OSDMap::_pg_to_up_acting_osds(pg_t pg, vector<int> *up, int *up_primary,
+ vector<int> *acting, int *acting_primary) const
{
const pg_pool_t *pool = get_pg_pool(pg.pool());
if (!pool)
return;
vector<int> raw;
vector<int> *_up = (up ? up : new vector<int>);
- _pg_to_osds(*pool, pg, raw);
- _raw_to_up_osds(pg, raw, *up);
- if (!_get_temp_osds(*pool, pg, acting))
- acting = *_up;
+ _pg_to_osds(*pool, pg, *raw);
+ _raw_to_up_osds(pg, raw, *_up);
+ if (up_primary)
+ *up_primary = (_up->empty() ? -1 : _up->front());
+ 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;
}
bool _get_temp_osds(const pg_pool_t& pool, pg_t pg, vector<int>& temp) const;
- /// map to up and acting. Only provides up if pointer is non-NULL
- void _pg_to_up_acting_osds(pg_t pg, vector<int> *up,
- vector<int>& acting) const;
+ /**
+ * map to up and acting. Fills in whatever fields are non-NULL, but
+ * the passed-in vectors must be empty.
+ */
+ void _pg_to_up_acting_osds(pg_t pg, vector<int> *up, int *up_primary,
+ vector<int> *acting, int *acting_primary) const;
public:
/***
/// map a pg to its acting set. @return acting set size
int pg_to_acting_osds(pg_t pg, vector<int> *acting,
int *acting_primary) const {
- _pg_to_up_acting_osds(pg, NULL, *acting);
- *acting_primary = (acting->empty() ? -1 : acting->front());
+ _pg_to_up_acting_osds(pg, NULL, NULL, acting, acting_primary);
return acting->size();
}
int pg_to_acting_osds(pg_t pg, vector<int>& acting) const {
*/
void pg_to_up_acting_osds(pg_t pg, vector<int> *up, int *up_primary,
vector<int> *acting, int *acting_primary) const {
- _pg_to_up_acting_osds(pg, up, *acting);
- *up_primary = (up->empty() ? -1 : up.front());
- *acting_primary = (acting->empty() ? -1 : acting.front());
+ _pg_to_up_acting_osds(pg, up, up_primary, acting, acting_primary);
}
void pg_to_up_acting_osds(pg_t pg, vector<int>& up, vector<int>& acting) const {
int up_primary, acting_primary;