diff options
author | Ilya Dryomov <ilya.dryomov@inktank.com> | 2013-12-24 14:19:25 -0500 |
---|---|---|
committer | Ilya Dryomov <ilya.dryomov@inktank.com> | 2013-12-31 13:32:20 -0500 |
commit | 4158608139de02f5265ec4f41774af7418911016 (patch) | |
tree | fe6b1afc043898e2e8de75dfa59dc32024ebe1af /net/ceph | |
parent | ab4ce2b5bdb5ca416756df3df6f5c63667a05065 (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>
Diffstat (limited to 'net/ceph')
-rw-r--r-- | net/ceph/crush/mapper.c | 10 |
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 | } |