libceph: fallback for when there isn't a pool-specific choose_arg
There is now a fallback to a choose_arg index of -1 if there isn't a pool-specific choose_arg set. If you create a per-pool weight-set, that works for that pool. Otherwise we try the compat/default one. If that doesn't exist either, then we use the normal CRUSH weights. Signed-off-by: Ilya Dryomov <idryomov@gmail.com> Reviewed-by: Sage Weil <sage@redhat.com>
This commit is contained in:
parent
4690faf00c
commit
e17e8969f5
|
@ -193,7 +193,7 @@ struct crush_choose_arg {
|
|||
struct crush_choose_arg_map {
|
||||
#ifdef __KERNEL__
|
||||
struct rb_node node;
|
||||
u64 choose_args_index;
|
||||
s64 choose_args_index;
|
||||
#endif
|
||||
struct crush_choose_arg *args; /*!< replacement for each bucket
|
||||
in the crushmap */
|
||||
|
|
|
@ -2301,10 +2301,17 @@ static u32 raw_pg_to_pps(struct ceph_pg_pool_info *pi,
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Magic value used for a "default" fallback choose_args, used if the
|
||||
* crush_choose_arg_map passed to do_crush() does not exist. If this
|
||||
* also doesn't exist, fall back to canonical weights.
|
||||
*/
|
||||
#define CEPH_DEFAULT_CHOOSE_ARGS -1
|
||||
|
||||
static int do_crush(struct ceph_osdmap *map, int ruleno, int x,
|
||||
int *result, int result_max,
|
||||
const __u32 *weight, int weight_max,
|
||||
u64 choose_args_index)
|
||||
s64 choose_args_index)
|
||||
{
|
||||
struct crush_choose_arg_map *arg_map;
|
||||
int r;
|
||||
|
@ -2313,6 +2320,9 @@ static int do_crush(struct ceph_osdmap *map, int ruleno, int x,
|
|||
|
||||
arg_map = lookup_choose_arg_map(&map->crush->choose_args,
|
||||
choose_args_index);
|
||||
if (!arg_map)
|
||||
arg_map = lookup_choose_arg_map(&map->crush->choose_args,
|
||||
CEPH_DEFAULT_CHOOSE_ARGS);
|
||||
|
||||
mutex_lock(&map->crush_workspace_mutex);
|
||||
r = crush_do_rule(map->crush, ruleno, x, result, result_max,
|
||||
|
|
Loading…
Reference in New Issue