crush: generalize descend_once
The legacy behavior is to make the normal number of tries for the recursive chooseleaf call. The descend_once tunable changed this to making a single try and bail if we get a reject (note that it is impossible to collide in the recursive case). The new set_chooseleaf_tries lets you select the number of recursive chooseleaf attempts for indep mode, or default to 1. Use the same behavior for firstn, except default to total_tries when the legacy tunables are set (for compatibility). This makes the rule step override the (new) default of 1 recursive attempt, keeping behavior consistent with indep mode. Reflects ceph.git commit 685c6950ef3df325ef04ce7c986e36ca2514c5f1. Signed-off-by: Ilya Dryomov <ilya.dryomov@inktank.com> Reviewed-by: Sage Weil <sage@inktank.com>
This commit is contained in:
parent
917edad5d1
commit
d390bb2a83
1 changed files with 14 additions and 11 deletions
|
@ -291,7 +291,6 @@ static int is_out(const struct crush_map *map,
|
||||||
* @out: pointer to output vector
|
* @out: pointer to output vector
|
||||||
* @outpos: our position in that vector
|
* @outpos: our position in that vector
|
||||||
* @recurse_to_leaf: true if we want one device under each item of given type
|
* @recurse_to_leaf: true if we want one device under each item of given type
|
||||||
* @descend_once: true if we should only try one descent before giving up
|
|
||||||
* @out2: second output vector for leaf items (if @recurse_to_leaf)
|
* @out2: second output vector for leaf items (if @recurse_to_leaf)
|
||||||
*/
|
*/
|
||||||
static int crush_choose_firstn(const struct crush_map *map,
|
static int crush_choose_firstn(const struct crush_map *map,
|
||||||
|
@ -302,7 +301,7 @@ static int crush_choose_firstn(const struct crush_map *map,
|
||||||
unsigned int attempts,
|
unsigned int attempts,
|
||||||
unsigned int recurse_attempts,
|
unsigned int recurse_attempts,
|
||||||
int recurse_to_leaf,
|
int recurse_to_leaf,
|
||||||
int descend_once, int *out2)
|
int *out2)
|
||||||
{
|
{
|
||||||
int rep;
|
int rep;
|
||||||
unsigned int ftotal, flocal;
|
unsigned int ftotal, flocal;
|
||||||
|
@ -389,7 +388,6 @@ static int crush_choose_firstn(const struct crush_map *map,
|
||||||
out2, outpos,
|
out2, outpos,
|
||||||
recurse_attempts, 0,
|
recurse_attempts, 0,
|
||||||
0,
|
0,
|
||||||
map->chooseleaf_descend_once,
|
|
||||||
NULL) <= outpos)
|
NULL) <= outpos)
|
||||||
/* didn't get leaf */
|
/* didn't get leaf */
|
||||||
reject = 1;
|
reject = 1;
|
||||||
|
@ -414,10 +412,7 @@ static int crush_choose_firstn(const struct crush_map *map,
|
||||||
ftotal++;
|
ftotal++;
|
||||||
flocal++;
|
flocal++;
|
||||||
|
|
||||||
if (reject && descend_once)
|
if (collide && flocal <= map->choose_local_tries)
|
||||||
/* let outer call try again */
|
|
||||||
skip_rep = 1;
|
|
||||||
else if (collide && flocal <= map->choose_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 (map->choose_local_fallback_tries > 0 &&
|
||||||
|
@ -639,7 +634,6 @@ int crush_do_rule(const struct crush_map *map,
|
||||||
int numrep;
|
int numrep;
|
||||||
int choose_tries = map->choose_total_tries;
|
int choose_tries = map->choose_total_tries;
|
||||||
int choose_leaf_tries = 0;
|
int choose_leaf_tries = 0;
|
||||||
const int descend_once = 0;
|
|
||||||
|
|
||||||
if ((__u32)ruleno >= map->max_rules) {
|
if ((__u32)ruleno >= map->max_rules) {
|
||||||
dprintk(" bad ruleno %d\n", ruleno);
|
dprintk(" bad ruleno %d\n", ruleno);
|
||||||
|
@ -703,6 +697,14 @@ int crush_do_rule(const struct crush_map *map,
|
||||||
}
|
}
|
||||||
j = 0;
|
j = 0;
|
||||||
if (firstn) {
|
if (firstn) {
|
||||||
|
int recurse_tries;
|
||||||
|
if (choose_leaf_tries)
|
||||||
|
recurse_tries =
|
||||||
|
choose_leaf_tries;
|
||||||
|
else if (map->chooseleaf_descend_once)
|
||||||
|
recurse_tries = 1;
|
||||||
|
else
|
||||||
|
recurse_tries = choose_tries;
|
||||||
osize += crush_choose_firstn(
|
osize += crush_choose_firstn(
|
||||||
map,
|
map,
|
||||||
map->buckets[-1-w[i]],
|
map->buckets[-1-w[i]],
|
||||||
|
@ -711,9 +713,9 @@ int crush_do_rule(const struct crush_map *map,
|
||||||
curstep->arg2,
|
curstep->arg2,
|
||||||
o+osize, j,
|
o+osize, j,
|
||||||
choose_tries,
|
choose_tries,
|
||||||
choose_leaf_tries ? choose_leaf_tries : choose_tries,
|
recurse_tries,
|
||||||
recurse_to_leaf,
|
recurse_to_leaf,
|
||||||
descend_once, c+osize);
|
c+osize);
|
||||||
} else {
|
} else {
|
||||||
crush_choose_indep(
|
crush_choose_indep(
|
||||||
map,
|
map,
|
||||||
|
@ -723,7 +725,8 @@ int crush_do_rule(const struct crush_map *map,
|
||||||
curstep->arg2,
|
curstep->arg2,
|
||||||
o+osize, j,
|
o+osize, j,
|
||||||
choose_tries,
|
choose_tries,
|
||||||
choose_leaf_tries ? choose_leaf_tries : 1,
|
choose_leaf_tries ?
|
||||||
|
choose_leaf_tries : 1,
|
||||||
recurse_to_leaf,
|
recurse_to_leaf,
|
||||||
c+osize,
|
c+osize,
|
||||||
0);
|
0);
|
||||||
|
|
Loading…
Add table
Reference in a new issue