virtual ~RatioMonitor() {}
virtual const char **get_tracked_conf_keys() const {
static const char *KEYS[] = { "mon_osd_full_ratio",
- "mon_osd_nearfull_ratio", NULL };
+ "mon_osd_nearfull_ratio",
+ NULL };
return KEYS;
}
virtual void handle_conf_change(const md_config_t *conf,
PGMonitor::PGMonitor(Monitor *mn, Paxos *p)
: PaxosService(mn, p),
- ratio_lock("PGMonitor::ratio_lock"), need_ratio_update(false),
+ ratio_lock("PGMonitor::ratio_lock"),
+ need_full_ratio_update(false),
+ need_nearfull_ratio_update(false)
{
ratio_monitor = new RatioMonitor(this);
g_conf->add_observer(ratio_monitor);
mon->cluster_logger->set(l_cluster_num_kb, pg_map.pg_sum.stats.sum.num_kb);
}
+void PGMonitor::update_full_ratios(float full_ratio, float nearfull_ratio)
+{
+ Mutex::Locker l(ratio_lock);
+ dout(10) << "update_full_ratios full " << full_ratio << " nearfull " << nearfull_ratio << dendl;
+ if (full_ratio != 0) {
+ new_full_ratio = full_ratio;
+ need_full_ratio_update = true;
+ }
+ if (nearfull_ratio != 0) {
+ new_nearfull_ratio = nearfull_ratio;
+ need_nearfull_ratio_update = true;
+ }
+}
+
void PGMonitor::tick()
{
if (!paxos->is_active()) return;
if (mon->is_leader()) {
ratio_lock.Lock();
- if (need_ratio_update) {
- need_ratio_update = false;
- pending_inc.full_ratio = new_full_ratio;
- pending_inc.nearfull_ratio = new_nearfull_ratio;
- propose_pending();
+ bool propose = false;
+ if (need_full_ratio_update) {
+ dout(10) << "tick need full ratio update " << new_full_ratio << dendl;
+ need_full_ratio_update = false;
+ if (pg_map.full_ratio != new_full_ratio) {
+ pending_inc.full_ratio = new_full_ratio;
+ propose = true;
+ }
+ }
+ if (need_nearfull_ratio_update) {
+ dout(10) << "tick need nearfull ratio update " << new_nearfull_ratio << dendl;
+ need_nearfull_ratio_update = false;
+ if (pg_map.nearfull_ratio != new_nearfull_ratio) {
+ pending_inc.nearfull_ratio = new_nearfull_ratio;
+ propose = true;
+ }
}
ratio_lock.Unlock();
+ if (propose) {
+ propose_pending();
+ }
}
dout(10) << pg_map << dendl;
PGMap pg_map;
Mutex ratio_lock;
- bool need_ratio_update;
+ bool need_full_ratio_update, need_nearfull_ratio_update;
float new_full_ratio, new_nearfull_ratio;
private:
bool prepare_pg_stats(MPGStats *stats);
void _updated_stats(MPGStats *req, MPGStatsAck *ack);
- void update_full_ratios(float full_ratio, int nearfull_ratio) {
- Mutex::Locker l(ratio_lock);
- if (full_ratio != 0)
- new_full_ratio = full_ratio;
- if (nearfull_ratio != 0)
- new_nearfull_ratio = nearfull_ratio;
- need_ratio_update = true;
- }
+ void update_full_ratios(float full_ratio, float nearfull_ratio);
struct C_Stats : public Context {
PGMonitor *pgmon;