@@ -1434,7 +1434,7 @@ struct lu_svr_qos {
struct obd_uuid lsq_uuid; /* ptlrpc's c_remote_uuid */
struct list_head lsq_svr_list; /* link to lq_svr_list */
u64 lsq_bavail; /* total bytes avail on svr */
- u64 lsq_iavail; /* tital inode avail on svr */
+ u64 lsq_iavail; /* total inode avail on svr */
u64 lsq_penalty; /* current penalty */
u64 lsq_penalty_per_obj; /* penalty decrease
* every obj
@@ -1451,6 +1451,7 @@ struct lu_tgt_qos {
u64 ltq_penalty_per_obj; /* penalty decrease
* every obj
*/
+ u64 ltq_avail; /* bytes/inode avail */
u64 ltq_weight; /* net weighting */
time64_t ltq_used; /* last used time, seconds */
bool ltq_usable:1; /* usable for striping */
@@ -1430,6 +1430,7 @@ static int lmv_close(struct obd_export *exp, struct md_op_data *op_data,
static struct lu_tgt_desc *lmv_locate_tgt_qos(struct lmv_obd *lmv, u32 *mdt)
{
struct lu_tgt_desc *tgt, *cur = NULL;
+ u64 total_avail = 0;
u64 total_weight = 0;
u64 cur_weight = 0;
int total_usable = 0;
@@ -1460,23 +1461,25 @@ static struct lu_tgt_desc *lmv_locate_tgt_qos(struct lmv_obd *lmv, u32 *mdt)
tgt->ltd_qos.ltq_usable = 1;
lu_tgt_qos_weight_calc(tgt);
- if (tgt->ltd_index == *mdt) {
+ if (tgt->ltd_index == *mdt)
cur = tgt;
- cur_weight = tgt->ltd_qos.ltq_weight;
- }
+ total_avail += tgt->ltd_qos.ltq_avail;
total_weight += tgt->ltd_qos.ltq_weight;
total_usable++;
}
- /* if current MDT has higher-than-average space, stay on same MDT */
- rand = total_weight / total_usable;
- if (cur_weight >= rand) {
+ /* if current MDT has above-average space, within range of the QOS
+ * threshold, stay on the same MDT to avoid creating needless remote
+ * MDT directories.
+ */
+ rand = total_avail * (256 - lmv->lmv_qos.lq_threshold_rr) /
+ (total_usable * 256);
+ if (cur && cur->ltd_qos.ltq_avail >= rand) {
tgt = cur;
rc = 0;
goto unlock;
}
- cur_weight = 0;
rand = lu_prandom_u64_max(total_weight);
lmv_foreach_connected_tgt(lmv, tgt) {
@@ -220,14 +220,15 @@ static inline u64 tgt_statfs_iavail(struct lu_tgt_desc *tgt)
void lu_tgt_qos_weight_calc(struct lu_tgt_desc *tgt)
{
struct lu_tgt_qos *ltq = &tgt->ltd_qos;
- u64 temp, temp2;
+ u64 penalty;
- temp = (tgt_statfs_bavail(tgt) >> 16) * (tgt_statfs_iavail(tgt) >> 8);
- temp2 = ltq->ltq_penalty + ltq->ltq_svr->lsq_penalty;
- if (temp < temp2)
+ ltq->ltq_avail = (tgt_statfs_bavail(tgt) >> 16) *
+ (tgt_statfs_iavail(tgt) >> 8);
+ penalty = ltq->ltq_penalty + ltq->ltq_svr->lsq_penalty;
+ if (ltq->ltq_avail < penalty)
ltq->ltq_weight = 0;
else
- ltq->ltq_weight = temp - temp2;
+ ltq->ltq_weight = ltq->ltq_avail - penalty;
}
EXPORT_SYMBOL(lu_tgt_qos_weight_calc);