aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIlya Dryomov <ilya.dryomov@inktank.com>2013-12-24 14:19:25 -0500
committerIlya Dryomov <ilya.dryomov@inktank.com>2013-12-31 13:32:20 -0500
commit4158608139de02f5265ec4f41774af7418911016 (patch)
treefe6b1afc043898e2e8de75dfa59dc32024ebe1af
parentab4ce2b5bdb5ca416756df3df6f5c63667a05065 (diff)
crush: pass parent r value for indep call
Pass down the parent's 'r' value so that we will sample different values in the recursive call when the parent tries multiple times. This avoids doing useless work (calling multiple times and trying the same values). Reflects ceph.git commit 2731d3030d7a3e80922b7f1b7756f9a4a124bac5. Signed-off-by: Ilya Dryomov <ilya.dryomov@inktank.com> Reviewed-by: Sage Weil <sage@inktank.com>
-rw-r--r--net/ceph/crush/mapper.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/net/ceph/crush/mapper.c b/net/ceph/crush/mapper.c
index 125dbd04f2b6..c727836b5860 100644
--- a/net/ceph/crush/mapper.c
+++ b/net/ceph/crush/mapper.c
@@ -460,7 +460,8 @@ static void crush_choose_indep(const struct crush_map *map,
460 int x, int left, int numrep, int type, 460 int x, int left, int numrep, int type,
461 int *out, int outpos, 461 int *out, int outpos,
462 int recurse_to_leaf, 462 int recurse_to_leaf,
463 int *out2) 463 int *out2,
464 int parent_r)
464{ 465{
465 struct crush_bucket *in = bucket; 466 struct crush_bucket *in = bucket;
466 int endpos = outpos + left; 467 int endpos = outpos + left;
@@ -499,7 +500,7 @@ static void crush_choose_indep(const struct crush_map *map,
499 * this will involve more devices in data 500 * this will involve more devices in data
500 * movement and tend to distribute the load. 501 * movement and tend to distribute the load.
501 */ 502 */
502 r = rep; 503 r = rep + parent_r;
503 504
504 /* be careful */ 505 /* be careful */
505 if (in->alg == CRUSH_BUCKET_UNIFORM && 506 if (in->alg == CRUSH_BUCKET_UNIFORM &&
@@ -567,7 +568,7 @@ static void crush_choose_indep(const struct crush_map *map,
567 weight, weight_max, 568 weight, weight_max,
568 x, 1, numrep, 0, 569 x, 1, numrep, 0,
569 out2, rep, 570 out2, rep,
570 0, NULL); 571 0, NULL, r);
571 if (out2[rep] == CRUSH_ITEM_NONE) { 572 if (out2[rep] == CRUSH_ITEM_NONE) {
572 /* placed nothing; no leaf */ 573 /* placed nothing; no leaf */
573 break; 574 break;
@@ -702,7 +703,8 @@ int crush_do_rule(const struct crush_map *map,
702 curstep->arg2, 703 curstep->arg2,
703 o+osize, j, 704 o+osize, j,
704 recurse_to_leaf, 705 recurse_to_leaf,
705 c+osize); 706 c+osize,
707 0);
706 osize += numrep; 708 osize += numrep;
707 } 709 }
708 } 710 }