Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f046bf92 authored by Ilya Dryomov's avatar Ilya Dryomov
Browse files

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: default avatarIlya Dryomov <ilya.dryomov@inktank.com>
Reviewed-by: default avatarSage Weil <sage@inktank.com>
parent d390bb2a
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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,
};

/*
+23 −5
Original line number Diff line number Diff line
@@ -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 {