return ol;
}
+void OSDMap::_remove_nonexistent_osds(vector<int>& osds) const
+{
+ 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.resize(osds.size() - removed);
+}
+
int OSDMap::_pg_to_osds(const pg_pool_t& pool, pg_t pg, vector<int>& osds) const
{
// map to osds[]
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);
-
+
+ _remove_nonexistent_osds(osds);
+
return osds.size();
}
private:
/// pg -> (raw osd list)
int _pg_to_osds(const pg_pool_t& pool, pg_t pg, vector<int>& osds) const;
+ void _remove_nonexistent_osds(vector<int>& osds) const;
/// pg -> (up osd list)
void _raw_to_up_osds(pg_t pg, vector<int>& raw, vector<int>& up) const;