mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-04 09:59:32 +00:00
![Ilya Dryomov](/assets/img/avatar_default.png)
bucket_straw2_choose needs to use weights that may be different from weight_items. For instance to compensate for an uneven distribution caused by a low number of values. Or to fix the probability biais introduced by conditional probabilities (see http://tracker.ceph.com/issues/15653 for more information). We introduce a weight_set for each straw2 bucket to set the desired weight for a given item at a given position. The weight of a given item when picking the first replica (first position) may be different from the weight the second replica (second position). For instance the weight matrix for a given bucket containing items 3, 7 and 13 could be as follows: position 0 position 1 item 3 0x10000 0x100000 item 7 0x40000 0x10000 item 13 0x40000 0x10000 When crush_do_rule picks the first of two replicas (position 0), item 7, 3 are four times more likely to be choosen by bucket_straw2_choose than item 13. When choosing the second replica (position 1), item 3 is ten times more likely to be choosen than item 7, 13. By default the weight_set of each bucket exactly matches the content of item_weights for each position to ensure backward compatibility. bucket_straw2_choose compares items by using their id. The same ids are also used to index buckets and they must be unique. For each item in a bucket an array of ids can be provided for placement purposes and they are used instead of the ids. If no replacement ids are provided, the legacy behavior is preserved. Reflects ceph.git commit 19537a450fd5c5a0bb8b7830947507a76db2ceca. Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
33 lines
963 B
C
33 lines
963 B
C
#ifndef CEPH_CRUSH_MAPPER_H
|
|
#define CEPH_CRUSH_MAPPER_H
|
|
|
|
/*
|
|
* CRUSH functions for find rules and then mapping an input to an
|
|
* output set.
|
|
*
|
|
* LGPL2
|
|
*/
|
|
|
|
#include "crush.h"
|
|
|
|
extern int crush_find_rule(const struct crush_map *map, int ruleset, int type, int size);
|
|
int crush_do_rule(const struct crush_map *map,
|
|
int ruleno, int x, int *result, int result_max,
|
|
const __u32 *weight, int weight_max,
|
|
void *cwin, const struct crush_choose_arg *choose_args);
|
|
|
|
/*
|
|
* Returns the exact amount of workspace that will need to be used
|
|
* for a given combination of crush_map and result_max. The caller can
|
|
* then allocate this much on its own, either on the stack, in a
|
|
* per-thread long-lived buffer, or however it likes.
|
|
*/
|
|
static inline size_t crush_work_size(const struct crush_map *map,
|
|
int result_max)
|
|
{
|
|
return map->working_size + result_max * 3 * sizeof(__u32);
|
|
}
|
|
|
|
void crush_init_workspace(const struct crush_map *map, void *v);
|
|
|
|
#endif
|