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:
parent
d390bb2a83
commit
f046bf9208
2 changed files with 25 additions and 5 deletions
|
@ -49,6 +49,8 @@ enum {
|
|||
|
||||
CRUSH_RULE_SET_CHOOSE_TRIES = 8, /* override choose_total_tries */
|
||||
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,
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -300,6 +300,8 @@ static int crush_choose_firstn(const struct crush_map *map,
|
|||
int *out, int outpos,
|
||||
unsigned int attempts,
|
||||
unsigned int recurse_attempts,
|
||||
unsigned int local_tries,
|
||||
unsigned int local_fallback_tries,
|
||||
int recurse_to_leaf,
|
||||
int *out2)
|
||||
{
|
||||
|
@ -338,9 +340,9 @@ static int crush_choose_firstn(const struct crush_map *map,
|
|||
reject = 1;
|
||||
goto reject;
|
||||
}
|
||||
if (map->choose_local_fallback_tries > 0 &&
|
||||
if (local_fallback_tries > 0 &&
|
||||
flocal >= (in->size>>1) &&
|
||||
flocal > map->choose_local_fallback_tries)
|
||||
flocal > local_fallback_tries)
|
||||
item = bucket_perm_choose(in, x, r);
|
||||
else
|
||||
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,
|
||||
out2, outpos,
|
||||
recurse_attempts, 0,
|
||||
local_tries,
|
||||
local_fallback_tries,
|
||||
0,
|
||||
NULL) <= outpos)
|
||||
/* didn't get leaf */
|
||||
|
@ -412,11 +416,11 @@ static int crush_choose_firstn(const struct crush_map *map,
|
|||
ftotal++;
|
||||
flocal++;
|
||||
|
||||
if (collide && flocal <= map->choose_local_tries)
|
||||
if (collide && flocal <= local_tries)
|
||||
/* retry locally a few times */
|
||||
retry_bucket = 1;
|
||||
else if (map->choose_local_fallback_tries > 0 &&
|
||||
flocal <= in->size + map->choose_local_fallback_tries)
|
||||
else if (local_fallback_tries > 0 &&
|
||||
flocal <= in->size + local_fallback_tries)
|
||||
/* exhaustive bucket search */
|
||||
retry_bucket = 1;
|
||||
else if (ftotal <= attempts)
|
||||
|
@ -633,6 +637,8 @@ int crush_do_rule(const struct crush_map *map,
|
|||
int i, j;
|
||||
int numrep;
|
||||
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;
|
||||
|
||||
if ((__u32)ruleno >= map->max_rules) {
|
||||
|
@ -665,6 +671,16 @@ int crush_do_rule(const struct crush_map *map,
|
|||
choose_leaf_tries = curstep->arg1;
|
||||
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_CHOOSE_FIRSTN:
|
||||
firstn = 1;
|
||||
|
@ -714,6 +730,8 @@ int crush_do_rule(const struct crush_map *map,
|
|||
o+osize, j,
|
||||
choose_tries,
|
||||
recurse_tries,
|
||||
choose_local_tries,
|
||||
choose_local_fallback_tries,
|
||||
recurse_to_leaf,
|
||||
c+osize);
|
||||
} else {
|
||||
|
|
Loading…
Reference in a new issue