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)
}
}
+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<int>::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();
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<int>::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;
ceph::shared_ptr<ObjectStore::Sequencer> osr;
void _update_calc_stats();
+ void _update_blocked_by();
void publish_stats_to_osd();
void clear_publish_stats();