From 18caa1cd8f084d1e6c8e8edb3b9db98c88e8d7a0 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Mon, 7 Apr 2014 16:37:46 -0700 Subject: [PATCH] OSD: split pg stats during pg split Fixes: #8020 Signed-off-by: Samuel Just --- src/osd/OSD.cc | 11 ++++++++++- src/osd/osd_types.h | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 986eef51b6e19..69faf9a315c2a 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -6160,9 +6160,15 @@ void OSD::split_pgs( parent->update_snap_mapper_bits( parent->info.pgid.get_split_bits(pg_num) ); + + vector updated_stats(childpgids.size() + 1); + parent->info.stats.stats.sum.split(updated_stats); + + vector::iterator stat_iter = updated_stats.begin(); for (set::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); @@ -6183,10 +6189,13 @@ void OSD::split_pgs( 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)); } diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 95ffadfc2f5af..4154d42fcfba8 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -1166,6 +1166,38 @@ struct object_stat_sum_t { #undef FLOOR } + void split(vector &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)); } -- 2.39.5