parent->update_snap_mapper_bits(
parent->info.pgid.get_split_bits(pg_num)
);
+
+ vector<object_stat_sum_t> updated_stats(childpgids.size() + 1);
+ parent->info.stats.stats.sum.split(updated_stats);
+
+ vector<object_stat_sum_t>::iterator stat_iter = updated_stats.begin();
for (set<spg_t>::const_iterator i = childpgids.begin();
i != childpgids.end();
- ++i) {
+ ++i, ++stat_iter) {
+ assert(stat_iter != updated_stats.end());
dout(10) << "Splitting " << *parent << " into " << *i << dendl;
assert(service.splitting(*i));
PG* child = _make_pg(nextmap, *i);
i->pgid,
child,
split_bits);
+ child->info.stats.stats.sum = *stat_iter;
child->write_if_dirty(*(rctx->transaction));
child->unlock();
}
+ assert(stat_iter != updated_stats.end());
+ parent->info.stats.stats.sum = *stat_iter;
parent->write_if_dirty(*(rctx->transaction));
}
#undef FLOOR
}
+ void split(vector<object_stat_sum_t> &out) const {
+#define SPLIT(PARAM) \
+ for (unsigned i = 0; i < out.size(); ++i) { \
+ out[i].PARAM = PARAM / out.size(); \
+ if (i < (PARAM % out.size())) { \
+ out[i].PARAM++; \
+ } \
+ } \
+
+ SPLIT(num_bytes);
+ SPLIT(num_objects);
+ SPLIT(num_object_clones);
+ SPLIT(num_object_copies);
+ SPLIT(num_objects_missing_on_primary);
+ SPLIT(num_objects_degraded);
+ SPLIT(num_objects_unfound);
+ SPLIT(num_rd);
+ SPLIT(num_rd_kb);
+ SPLIT(num_wr);
+ SPLIT(num_wr_kb);
+ SPLIT(num_scrub_errors);
+ SPLIT(num_shallow_scrub_errors);
+ SPLIT(num_deep_scrub_errors);
+ SPLIT(num_objects_recovered);
+ SPLIT(num_bytes_recovered);
+ SPLIT(num_keys_recovered);
+ SPLIT(num_objects_dirty);
+ SPLIT(num_whiteouts);
+ SPLIT(num_objects_omap);
+#undef SPLIT
+ }
+
void clear() {
memset(this, 0, sizeof(*this));
}