From: Sage Weil Date: Sat, 9 Aug 2014 01:07:28 +0000 (-0700) Subject: osd/PG: bound number of blocked_by OSDs we report per PG X-Git-Tag: v0.85~27^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d8627313a4adce8b007f4db5e7cd031d65c9dd7d;p=ceph.git osd/PG: bound number of blocked_by OSDs we report per PG We don't want to include an unbounded-sized vector of OSDs in the pg_stat_t struct. Cap it, and report a random subset of the actual blockers to fit within the limit. Signed-off-by: Sage Weil --- diff --git a/src/common/config_opts.h b/src/common/config_opts.h index b07b6a7ed246..f8b263c19b3d 100644 --- a/src/common/config_opts.h +++ b/src/common/config_opts.h @@ -538,6 +538,7 @@ OPTION(osd_min_pg_log_entries, OPT_U32, 3000) // number of entries to keep in t OPTION(osd_max_pg_log_entries, OPT_U32, 10000) // max entries, say when degraded, before we trim OPTION(osd_op_complaint_time, OPT_FLOAT, 30) // how many seconds old makes an op complaint-worthy OPTION(osd_command_max_records, OPT_INT, 256) +OPTION(osd_max_pg_blocked_by, OPT_U32, 16) // max peer osds to report that are blocking our progress OPTION(osd_op_log_threshold, OPT_INT, 5) // how many op log messages to show in one go OPTION(osd_verify_sparse_read_holes, OPT_BOOL, false) // read fiemap-reported holes and verify they are zeros OPTION(osd_debug_drop_ping_probability, OPT_DOUBLE, 0) diff --git a/src/osd/PG.cc b/src/osd/PG.cc index df51ef4c5487..52a146907d4f 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -2245,6 +2245,27 @@ void PG::_update_calc_stats() } } +void PG::_update_blocked_by() +{ + // set a max on the number of blocking peers we report. if we go + // over, report a random subset. keep the result sorted. + unsigned keep = MIN(blocked_by.size(), g_conf->osd_max_pg_blocked_by); + unsigned skip = blocked_by.size() - keep; + info.stats.blocked_by.clear(); + info.stats.blocked_by.resize(keep); + unsigned pos = 0; + for (set::iterator p = blocked_by.begin(); + p != blocked_by.end() && keep > 0; + ++p) { + if (skip > 0 && (rand() % (skip + keep) < skip)) { + --skip; + } else { + info.stats.blocked_by[pos++] = *p; + --keep; + } + } +} + void PG::publish_stats_to_osd() { pg_stats_publish_lock.Lock(); @@ -2274,12 +2295,7 @@ void PG::publish_stats_to_osd() info.stats.last_unstale = now; _update_calc_stats(); - - info.stats.blocked_by.clear(); - info.stats.blocked_by.resize(blocked_by.size()); - unsigned pos = 0; - for (set::iterator p = blocked_by.begin(); p != blocked_by.end(); ++p) - info.stats.blocked_by[pos++] = *p; + _update_blocked_by(); pg_stats_publish_valid = true; pg_stats_publish = info.stats; diff --git a/src/osd/PG.h b/src/osd/PG.h index 714b1fc67978..02b575856658 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -751,6 +751,7 @@ protected: ceph::shared_ptr osr; void _update_calc_stats(); + void _update_blocked_by(); void publish_stats_to_osd(); void clear_publish_stats();