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:18 -0500 |
commit | 9fe07182827d9913daf85f3e6a950578a3fd4c5d (patch) | |
tree | 185ee75b1a5b687dcfcee9f43178401badcda544 /net/ceph | |
parent | 3102b0a5b4cd63acccac78ca541b73fe28b4faa6 (diff) |
crush: strip firstn conditionals out of crush_choose, rename
Now that indep is handled by crush_choose_indep, rename crush_choose to
crush_choose_firstn and remove all the conditionals. This ends up
stripping out *lots* of code.
Note that it *also* makes it obvious that the shenanigans we were playing
with r' for uniform buckets were broken for firstn mode. This appears to
have happened waaaay back in commit dae8bec9 (or earlier)... 2007.
Reflects ceph.git commit 94350996cb2035850bcbece6a77a9b0394177ec9.
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 | 88 |
1 files changed, 33 insertions, 55 deletions
diff --git a/net/ceph/crush/mapper.c b/net/ceph/crush/mapper.c index 77b7a73e65cf..a71f8c4c78ec 100644 --- a/net/ceph/crush/mapper.c +++ b/net/ceph/crush/mapper.c | |||
@@ -282,7 +282,7 @@ static int is_out(const struct crush_map *map, | |||
282 | } | 282 | } |
283 | 283 | ||
284 | /** | 284 | /** |
285 | * crush_choose - choose numrep distinct items of given type | 285 | * crush_choose_firstn - choose numrep distinct items of given type |
286 | * @map: the crush_map | 286 | * @map: the crush_map |
287 | * @bucket: the bucket we are choose an item from | 287 | * @bucket: the bucket we are choose an item from |
288 | * @x: crush input value | 288 | * @x: crush input value |
@@ -290,18 +290,17 @@ static int is_out(const struct crush_map *map, | |||
290 | * @type: the type of item to choose | 290 | * @type: the type of item to choose |
291 | * @out: pointer to output vector | 291 | * @out: pointer to output vector |
292 | * @outpos: our position in that vector | 292 | * @outpos: our position in that vector |
293 | * @firstn: true if choosing "first n" items, false if choosing "indep" | ||
294 | * @recurse_to_leaf: true if we want one device under each item of given type | 293 | * @recurse_to_leaf: true if we want one device under each item of given type |
295 | * @descend_once: true if we should only try one descent before giving up | 294 | * @descend_once: true if we should only try one descent before giving up |
296 | * @out2: second output vector for leaf items (if @recurse_to_leaf) | 295 | * @out2: second output vector for leaf items (if @recurse_to_leaf) |
297 | */ | 296 | */ |
298 | static int crush_choose(const struct crush_map *map, | 297 | static int crush_choose_firstn(const struct crush_map *map, |
299 | struct crush_bucket *bucket, | 298 | struct crush_bucket *bucket, |
300 | const __u32 *weight, int weight_max, | 299 | const __u32 *weight, int weight_max, |
301 | int x, int numrep, int type, | 300 | int x, int numrep, int type, |
302 | int *out, int outpos, | 301 | int *out, int outpos, |
303 | int firstn, int recurse_to_leaf, | 302 | int recurse_to_leaf, |
304 | int descend_once, int *out2) | 303 | int descend_once, int *out2) |
305 | { | 304 | { |
306 | int rep; | 305 | int rep; |
307 | unsigned int ftotal, flocal; | 306 | unsigned int ftotal, flocal; |
@@ -330,26 +329,8 @@ static int crush_choose(const struct crush_map *map, | |||
330 | collide = 0; | 329 | collide = 0; |
331 | retry_bucket = 0; | 330 | retry_bucket = 0; |
332 | r = rep; | 331 | r = rep; |
333 | if (in->alg == CRUSH_BUCKET_UNIFORM) { | 332 | /* r' = r + f_total */ |
334 | /* be careful */ | 333 | r += ftotal; |
335 | if (firstn || (__u32)numrep >= in->size) | ||
336 | /* r' = r + f_total */ | ||
337 | r += ftotal; | ||
338 | else if (in->size % numrep == 0) | ||
339 | /* r'=r+(n+1)*f_local */ | ||
340 | r += (numrep+1) * | ||
341 | (flocal+ftotal); | ||
342 | else | ||
343 | /* r' = r + n*f_local */ | ||
344 | r += numrep * (flocal+ftotal); | ||
345 | } else { | ||
346 | if (firstn) | ||
347 | /* r' = r + f_total */ | ||
348 | r += ftotal; | ||
349 | else | ||
350 | /* r' = r + n*f_local */ | ||
351 | r += numrep * (flocal+ftotal); | ||
352 | } | ||
353 | 334 | ||
354 | /* bucket choose */ | 335 | /* bucket choose */ |
355 | if (in->size == 0) { | 336 | if (in->size == 0) { |
@@ -399,12 +380,12 @@ static int crush_choose(const struct crush_map *map, | |||
399 | reject = 0; | 380 | reject = 0; |
400 | if (!collide && recurse_to_leaf) { | 381 | if (!collide && recurse_to_leaf) { |
401 | if (item < 0) { | 382 | if (item < 0) { |
402 | if (crush_choose(map, | 383 | if (crush_choose_firstn(map, |
403 | map->buckets[-1-item], | 384 | map->buckets[-1-item], |
404 | weight, weight_max, | 385 | weight, weight_max, |
405 | x, outpos+1, 0, | 386 | x, outpos+1, 0, |
406 | out2, outpos, | 387 | out2, outpos, |
407 | firstn, 0, | 388 | 0, |
408 | map->chooseleaf_descend_once, | 389 | map->chooseleaf_descend_once, |
409 | NULL) <= outpos) | 390 | NULL) <= outpos) |
410 | /* didn't get leaf */ | 391 | /* didn't get leaf */ |
@@ -455,12 +436,8 @@ reject: | |||
455 | } while (retry_descent); | 436 | } while (retry_descent); |
456 | 437 | ||
457 | if (skip_rep) { | 438 | if (skip_rep) { |
458 | if (firstn) { | 439 | dprintk("skip rep\n"); |
459 | dprintk("skip rep\n"); | 440 | continue; |
460 | continue; | ||
461 | } | ||
462 | dprintk("undef rep, continuing\n"); | ||
463 | item = CRUSH_ITEM_UNDEF; | ||
464 | } | 441 | } |
465 | 442 | ||
466 | dprintk("CHOOSE got %d\n", item); | 443 | dprintk("CHOOSE got %d\n", item); |
@@ -474,7 +451,7 @@ reject: | |||
474 | 451 | ||
475 | 452 | ||
476 | /** | 453 | /** |
477 | * choose indep: alternative breadth-first positionally stable mapping | 454 | * crush_choose_indep: alternative breadth-first positionally stable mapping |
478 | * | 455 | * |
479 | */ | 456 | */ |
480 | static void crush_choose_indep(const struct crush_map *map, | 457 | static void crush_choose_indep(const struct crush_map *map, |
@@ -707,24 +684,25 @@ int crush_do_rule(const struct crush_map *map, | |||
707 | } | 684 | } |
708 | j = 0; | 685 | j = 0; |
709 | if (firstn) { | 686 | if (firstn) { |
710 | osize += crush_choose(map, | 687 | osize += crush_choose_firstn( |
711 | map->buckets[-1-w[i]], | 688 | map, |
712 | weight, weight_max, | 689 | map->buckets[-1-w[i]], |
713 | x, numrep, | 690 | weight, weight_max, |
714 | curstep->arg2, | 691 | x, numrep, |
715 | o+osize, j, | 692 | curstep->arg2, |
716 | firstn, | 693 | o+osize, j, |
717 | recurse_to_leaf, | 694 | recurse_to_leaf, |
718 | descend_once, c+osize); | 695 | descend_once, c+osize); |
719 | } else { | 696 | } else { |
720 | crush_choose_indep(map, | 697 | crush_choose_indep( |
721 | map->buckets[-1-w[i]], | 698 | map, |
722 | weight, weight_max, | 699 | map->buckets[-1-w[i]], |
723 | x, numrep, | 700 | weight, weight_max, |
724 | curstep->arg2, | 701 | x, numrep, |
725 | o+osize, j, | 702 | curstep->arg2, |
726 | recurse_to_leaf, | 703 | o+osize, j, |
727 | c+osize); | 704 | recurse_to_leaf, |
705 | c+osize); | ||
728 | osize += numrep; | 706 | osize += numrep; |
729 | } | 707 | } |
730 | } | 708 | } |