return false;
}
-int OSDMap::pg_to_osds(pg_t pg, vector<int>& raw) const
+int OSDMap::pg_to_osds(pg_t pg, vector<int> *raw, int *primary) const
{
+ *primary = -1;
const pg_pool_t *pool = get_pg_pool(pg.pool());
if (!pool)
return 0;
- return _pg_to_osds(*pool, pg, raw);
+ int r = _pg_to_osds(*pool, pg, *raw);
+ *primary = (raw->empty() ? -1 : raw->front());
+ return r;
}
void OSDMap::pg_to_raw_up(pg_t pg, vector<int>& up) const
* This is suitable only for looking at raw CRUSH outputs. It skips
* applying the temp and up checks and should not be used
* by anybody for data mapping purposes.
+ * raw and primary must be non-NULL
*/
- int pg_to_osds(pg_t pg, vector<int>& raw) const;
+ int pg_to_osds(pg_t pg, vector<int> *raw, int *primary) const;
/// map a pg to its acting set. @return acting set size
int pg_to_acting_osds(pg_t pg, vector<int>& acting) const {
_pg_to_up_acting_osds(pg, NULL, acting);
cout << " parsed '" << test_map_pg << "' -> " << pgid << std::endl;
vector<int> raw, up, acting;
- osdmap.pg_to_osds(pgid, raw);
+ int primary;
+ osdmap.pg_to_osds(pgid, &raw, &primary);
osdmap.pg_to_up_acting_osds(pgid, up, acting);
- cout << pgid << " raw " << raw << " up " << up << " acting " << acting << std::endl;
+ cout << pgid << " raw (" << raw << ", p" << primary << ") up " << up << " acting " << acting << std::endl;
}
if (test_crush) {
int pass = 0;
vector<int> osds;
pg_t pgid = pg_t(l.ol_pgid);
//pgid.u.ps = f * 4 + b;
- osdmap.pg_to_osds(pgid, osds);
+ int primary;
+ osdmap.pg_to_osds(pgid, &osds, &primary);
size[osds.size()]++;
#if 0
if (0) {