Whamcloud - gitweb
LU-14762 lmv: compare space to mkdir on parent MDT
[fs/lustre-release.git] / lustre / lmv / lmv_obd.c
index 9560c16..ba1b656 100644 (file)
@@ -1462,6 +1462,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;
 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;
        __u64 total_weight = 0;
        __u64 cur_weight = 0;
        int total_usable = 0;
@@ -1490,22 +1491,24 @@ 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);
 
                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 = tgt;
-                       cur_weight = tgt->ltd_qos.ltq_weight;
-               }
+               total_avail += tgt->ltd_qos.ltq_avail;
                total_weight += tgt->ltd_qos.ltq_weight;
                total_usable++;
        }
 
                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;
                GOTO(unlock, rc = 0);
        }
 
                tgt = cur;
                GOTO(unlock, rc = 0);
        }
 
-       cur_weight = 0;
        rand = lu_prandom_u64_max(total_weight);
 
        lmv_foreach_connected_tgt(lmv, tgt) {
        rand = lu_prandom_u64_max(total_weight);
 
        lmv_foreach_connected_tgt(lmv, tgt) {