crush: add set_choose_local_[fallback_]tries steps

This allows all of the tunables to be overridden by a specific rule.

Reflects ceph.git commits d129e09e57fbc61cfd4f492e3ee77d0750c9d292,
                          0497db49e5973b50df26251ed0e3f4ac7578e66e.

Signed-off-by: Ilya Dryomov <ilya.dryomov@inktank.com>
Reviewed-by: Sage Weil <sage@inktank.com>
This commit is contained in:
Ilya Dryomov 2013-12-24 21:19:27 +02:00
parent d390bb2a83
commit f046bf9208
2 changed files with 25 additions and 5 deletions

View File

@ -49,6 +49,8 @@ enum {
CRUSH_RULE_SET_CHOOSE_TRIES = 8, /* override choose_total_tries */ CRUSH_RULE_SET_CHOOSE_TRIES = 8, /* override choose_total_tries */
CRUSH_RULE_SET_CHOOSELEAF_TRIES = 9, /* override chooseleaf_descend_once */ CRUSH_RULE_SET_CHOOSELEAF_TRIES = 9, /* override chooseleaf_descend_once */
CRUSH_RULE_SET_CHOOSE_LOCAL_TRIES = 10,
CRUSH_RULE_SET_CHOOSE_LOCAL_FALLBACK_TRIES = 11,
}; };
/* /*

View File

@ -300,6 +300,8 @@ static int crush_choose_firstn(const struct crush_map *map,
int *out, int outpos, int *out, int outpos,
unsigned int attempts, unsigned int attempts,
unsigned int recurse_attempts, unsigned int recurse_attempts,
unsigned int local_tries,
unsigned int local_fallback_tries,
int recurse_to_leaf, int recurse_to_leaf,
int *out2) int *out2)
{ {
@ -338,9 +340,9 @@ static int crush_choose_firstn(const struct crush_map *map,
reject = 1; reject = 1;
goto reject; goto reject;
} }
if (map->choose_local_fallback_tries > 0 && if (local_fallback_tries > 0 &&
flocal >= (in->size>>1) && flocal >= (in->size>>1) &&
flocal > map->choose_local_fallback_tries) flocal > local_fallback_tries)
item = bucket_perm_choose(in, x, r); item = bucket_perm_choose(in, x, r);
else else
item = crush_bucket_choose(in, x, r); item = crush_bucket_choose(in, x, r);
@ -387,6 +389,8 @@ static int crush_choose_firstn(const struct crush_map *map,
x, outpos+1, 0, x, outpos+1, 0,
out2, outpos, out2, outpos,
recurse_attempts, 0, recurse_attempts, 0,
local_tries,
local_fallback_tries,
0, 0,
NULL) <= outpos) NULL) <= outpos)
/* didn't get leaf */ /* didn't get leaf */
@ -412,11 +416,11 @@ reject:
ftotal++; ftotal++;
flocal++; flocal++;
if (collide && flocal <= map->choose_local_tries) if (collide && flocal <= local_tries)
/* retry locally a few times */ /* retry locally a few times */
retry_bucket = 1; retry_bucket = 1;
else if (map->choose_local_fallback_tries > 0 && else if (local_fallback_tries > 0 &&
flocal <= in->size + map->choose_local_fallback_tries) flocal <= in->size + local_fallback_tries)
/* exhaustive bucket search */ /* exhaustive bucket search */
retry_bucket = 1; retry_bucket = 1;
else if (ftotal <= attempts) else if (ftotal <= attempts)
@ -633,6 +637,8 @@ int crush_do_rule(const struct crush_map *map,
int i, j; int i, j;
int numrep; int numrep;
int choose_tries = map->choose_total_tries; int choose_tries = map->choose_total_tries;
int choose_local_tries = map->choose_local_tries;
int choose_local_fallback_tries = map->choose_local_fallback_tries;
int choose_leaf_tries = 0; int choose_leaf_tries = 0;
if ((__u32)ruleno >= map->max_rules) { if ((__u32)ruleno >= map->max_rules) {
@ -665,6 +671,16 @@ int crush_do_rule(const struct crush_map *map,
choose_leaf_tries = curstep->arg1; choose_leaf_tries = curstep->arg1;
break; break;
case CRUSH_RULE_SET_CHOOSE_LOCAL_TRIES:
if (curstep->arg1 > 0)
choose_local_tries = curstep->arg1;
break;
case CRUSH_RULE_SET_CHOOSE_LOCAL_FALLBACK_TRIES:
if (curstep->arg1 > 0)
choose_local_fallback_tries = curstep->arg1;
break;
case CRUSH_RULE_CHOOSELEAF_FIRSTN: case CRUSH_RULE_CHOOSELEAF_FIRSTN:
case CRUSH_RULE_CHOOSE_FIRSTN: case CRUSH_RULE_CHOOSE_FIRSTN:
firstn = 1; firstn = 1;
@ -714,6 +730,8 @@ int crush_do_rule(const struct crush_map *map,
o+osize, j, o+osize, j,
choose_tries, choose_tries,
recurse_tries, recurse_tries,
choose_local_tries,
choose_local_fallback_tries,
recurse_to_leaf, recurse_to_leaf,
c+osize); c+osize);
} else { } else {