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;
+void OSDMap::_remove_nonexistent_osds(const pg_pool_t& pool,
+ vector<int>& 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<int>::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<int>& 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();
}
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;
+ void _remove_nonexistent_osds(const pg_pool_t& pool, vector<int>& osds) const;
/// pg -> (up osd list)
void _raw_to_up_osds(pg_t pg, vector<int>& raw, vector<int>& up) const;
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; }