<< ").pg v" << pg_map.version << " ";
}
-class RatioMonitor : public md_config_obs_t {
- PGMonitor *mon;
-public:
- RatioMonitor(PGMonitor *pgmon) : mon(pgmon) {}
- virtual ~RatioMonitor() {}
- virtual const char **get_tracked_conf_keys() const {
- static const char *KEYS[] = { "mon_osd_full_ratio",
- "mon_osd_nearfull_ratio",
- NULL };
- return KEYS;
- }
- virtual void handle_conf_change(const md_config_t *conf,
- const std::set<std::string>& changed) {
- mon->update_full_ratios(conf->mon_osd_full_ratio,
- conf->mon_osd_nearfull_ratio);
- }
-};
-
PGMonitor::PGMonitor(Monitor *mn, Paxos *p)
: PaxosService(mn, p),
- ratio_lock("PGMonitor::ratio_lock"),
- need_full_ratio_update(false),
- need_nearfull_ratio_update(false),
need_check_down_pgs(false)
-{
- ratio_monitor = new RatioMonitor(this);
- g_conf->add_observer(ratio_monitor);
-}
+{ }
-PGMonitor::~PGMonitor()
-{
- g_conf->remove_observer(ratio_monitor);
- delete ratio_monitor;
-}
+PGMonitor::~PGMonitor() {}
/*
Tick function to update the map based on performance every N seconds
mon->cluster_logger->set(l_cluster_num_bytes, pg_map.pg_sum.stats.sum.num_bytes);
}
-void PGMonitor::update_full_ratios(float full_ratio, float nearfull_ratio)
-{
- Mutex::Locker l(ratio_lock);
-
- if (full_ratio > 1.0)
- full_ratio /= 100.0;
- if (nearfull_ratio > 1.0)
- nearfull_ratio /= 100.0;
-
- 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;
handle_osd_timeouts();
if (mon->is_leader()) {
- ratio_lock.Lock();
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 (need_check_down_pgs && check_down_pgs())
propose = true;
public:
PGMap pg_map;
- Mutex ratio_lock;
- bool need_full_ratio_update, need_nearfull_ratio_update;
- float new_full_ratio, new_nearfull_ratio;
-
bool need_check_down_pgs;
private:
bool prepare_pg_stats(MPGStats *stats);
void _updated_stats(MPGStats *req, MPGStatsAck *ack);
- void update_full_ratios(float full_ratio, float nearfull_ratio);
-
struct C_Stats : public Context {
PGMonitor *pgmon;
MPGStats *req;
// no copying allowed
PGMonitor(const PGMonitor &rhs);
PGMonitor &operator=(const PGMonitor &rhs);
-
- RatioMonitor *ratio_monitor;
- friend class RatioMonitor;
};
#endif