Commit e17e8969 authored by Ilya Dryomov's avatar Ilya Dryomov

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: default avatarIlya Dryomov <idryomov@gmail.com>
Reviewed-by: default avatarSage Weil <sage@redhat.com>
parent 4690faf0
...@@ -193,7 +193,7 @@ struct crush_choose_arg { ...@@ -193,7 +193,7 @@ struct crush_choose_arg {
struct crush_choose_arg_map { struct crush_choose_arg_map {
#ifdef __KERNEL__ #ifdef __KERNEL__
struct rb_node node; struct rb_node node;
u64 choose_args_index; s64 choose_args_index;
#endif #endif
struct crush_choose_arg *args; /*!< replacement for each bucket struct crush_choose_arg *args; /*!< replacement for each bucket
in the crushmap */ in the crushmap */
......
...@@ -2301,10 +2301,17 @@ static u32 raw_pg_to_pps(struct ceph_pg_pool_info *pi, ...@@ -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, static int do_crush(struct ceph_osdmap *map, int ruleno, int x,
int *result, int result_max, int *result, int result_max,
const __u32 *weight, int weight_max, const __u32 *weight, int weight_max,
u64 choose_args_index) s64 choose_args_index)
{ {
struct crush_choose_arg_map *arg_map; struct crush_choose_arg_map *arg_map;
int r; int r;
...@@ -2313,6 +2320,9 @@ static int do_crush(struct ceph_osdmap *map, int ruleno, int x, ...@@ -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, arg_map = lookup_choose_arg_map(&map->crush->choose_args,
choose_args_index); 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); mutex_lock(&map->crush_workspace_mutex);
r = crush_do_rule(map->crush, ruleno, x, result, result_max, r = crush_do_rule(map->crush, ruleno, x, result, result_max,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment