friend class C_Bal_SendHeartbeat;
public:
MDBalancer(MDSRank *m, Messenger *msgr, MonClient *monc) :
- mds(m),
- messenger(msgr),
- mon_client(monc),
- beat_epoch(0),
- last_epoch_under(0), my_load(0.0), target_load(0.0)
- { }
-
- mds_load_t get_load(utime_t);
+ mds(m), messenger(msgr), mon_client(monc) { }
int proc_message(Message *m);
void subtract_export(CDir *ex, utime_t now);
void add_import(CDir *im, utime_t now);
+ void adjust_pop_for_rename(CDir *pdir, CDir *dir, utime_t now, bool inc);
- void hit_inode(utime_t now, CInode *in, int type, int who=-1);
- void hit_dir(utime_t now, CDir *dir, int type, int who=-1, double amount=1.0);
+ void hit_inode(const utime_t& now, CInode *in, int type, int who=-1);
+ void hit_dir(const utime_t& now, CDir *dir, int type, int who=-1, double amount=1.0);
void queue_split(const CDir *dir, bool fast);
void queue_merge(CDir *dir);
void handle_mds_failure(mds_rank_t who);
+ int dump_loads(Formatter *f);
+
private:
typedef struct {
std::map<mds_rank_t, double> targets;
void handle_export_pins(void);
- void export_empties();
+ mds_load_t get_load(utime_t now);
int localize_balancer();
void send_heartbeat();
void handle_heartbeat(MHeartbeat *m);
MDSRank *mds;
Messenger *messenger;
MonClient *mon_client;
- int beat_epoch;
+ int beat_epoch = 0;
- int last_epoch_under;
string bal_code;
string bal_version;
utime_t last_sample;
utime_t rebalance_time; //ensure a consistent view of load for rebalance
+ utime_t last_get_load;
+ uint64_t last_num_requests = 0;
+
// Dirfrags which are marked to be passed on to MDCache::[split|merge]_dir
// just as soon as a delayed context comes back and triggers it.
// These sets just prevent us from spawning extra timer contexts for
map<mds_rank_t, mds_load_t> mds_load;
map<mds_rank_t, double> mds_meta_load;
map<mds_rank_t, map<mds_rank_t, float> > mds_import_map;
+ map<mds_rank_t, int> mds_last_epoch_under_map;
// per-epoch state
- double my_load, target_load;
+ double my_load = 0;
+ double target_load = 0;
};
#endif