23 #define M0_TRACE_SUBSYSTEM M0_TRACE_SUBSYS_FD 67 uint64_t *children_nr);
76 uint64_t *children_nr,
77 uint32_t first_level, uint32_t *failure_level);
83 uint64_t parent_nr, uint64_t child_nr);
90 static uint64_t
units_calc(uint64_t **units, uint64_t
level, uint64_t parent_nr,
91 uint64_t child_nr, uint64_t tol);
100 uint64_t *rel_vidx, uint64_t *tgt_idx);
104 uint64_t omega, uint64_t perm_idx,
171 #define pv_for(pv, level, obj, rc) \ 173 struct m0_confc *__confc; \ 174 struct m0_conf_pver *__pv = (struct m0_conf_pver *)(pv); \ 175 uint64_t __level = (level); \ 176 struct m0_conf_diter __it; \ 177 struct m0_fid conf_path[M0_CONF_PVER_HEIGHT][M0_CONF_PVER_HEIGHT] = { \ 178 { M0_CONF_PVER_SITEVS_FID }, \ 179 { M0_CONF_PVER_SITEVS_FID, M0_CONF_SITEV_RACKVS_FID }, \ 180 { M0_CONF_PVER_SITEVS_FID, M0_CONF_SITEV_RACKVS_FID, \ 181 M0_CONF_RACKV_ENCLVS_FID }, \ 182 { M0_CONF_PVER_SITEVS_FID, M0_CONF_SITEV_RACKVS_FID, \ 183 M0_CONF_RACKV_ENCLVS_FID, M0_CONF_ENCLV_CTRLVS_FID }, \ 184 { M0_CONF_PVER_SITEVS_FID, M0_CONF_SITEV_RACKVS_FID, \ 185 M0_CONF_RACKV_ENCLVS_FID, M0_CONF_ENCLV_CTRLVS_FID, \ 186 M0_CONF_CTRLV_DRIVEVS_FID }, \ 188 __confc = (struct m0_confc *)m0_confc_from_obj(&__pv->pv_obj); \ 189 M0_ASSERT(__confc != NULL); \ 190 rc = m0_conf__diter_init(&__it, __confc, &__pv->pv_obj, \ 191 __level + 1, conf_path[__level]); \ 193 (rc = m0_conf_diter_next_sync(&__it, \ 194 is_obj_at_level[__level])) != \ 195 M0_CONF_DIRNEXT) {;} \ 196 for (obj = m0_conf_diter_result(&__it); \ 197 rc > 0 && (obj = m0_conf_diter_result(&__it)); \ 198 rc = m0_conf_diter_next_sync(&__it, \ 199 is_obj_at_level[__level])) { \ 201 #define pv_endfor } if (rc >= 0) m0_conf_diter_fini(&__it); }) 206 uint64_t *children, uint64_t
depth)
251 uint32_t *failure_level)
262 uint32_t *failure_level)
282 children_nr, *failure_level);
287 M0_LEAVE(
"Symm tree pool width = %d\tFD tree depth = %d",
299 uint64_t *children_nr)
315 pv->pv_u.subtree.pvs_tolerance[pver_level] == 0)
332 for (
i = 1, j = pver_level;
i < *
depth; ++
i, ++j) {
349 children_nr[*
depth] = 1;
385 uint32_t first_level, uint32_t *failure_level)
394 uint32_t
depth = *failure_level;
399 K =
pv->pv_u.subtree.pvs_attr.pa_K;
404 if (units[
i] ==
NULL) {
406 for (
i =
i - 1;
i >= 0; --
i)
419 pv->pv_u.subtree.pvs_tolerance[first_level +
422 i, (
int)
sum, (
int)K, (
int)children_nr[
i - 1]);
424 *failure_level = first_level +
i - 1;
428 nodes *= children_nr[
i - 1];
437 uint64_t parent_nr, uint64_t child_nr)
444 for (pid = 0; pid < parent_nr; ++pid) {
445 u_nr = units[
level - 1][pid];
446 for (cid = 0; cid < child_nr; ++cid) {
447 g_cid = pid * child_nr + cid;
448 units[
level][g_cid] = (uint64_t)(u_nr / child_nr);
450 for (cid = 0; cid < (u_nr % child_nr); ++cid) {
451 g_cid = pid * child_nr + cid;
452 units[
level][g_cid] += 1;
458 uint64_t child_nr, uint64_t tol)
465 for (cid = 0;
cnt < tol && cid < child_nr; ++cid) {
466 for (pid = 0;
cnt < tol && pid < parent_nr; ++pid) {
467 sum += units[
level][pid * child_nr + cid];
484 return m0_reduce(
i,
depth, 1, * children_nr[
i]);
494 uint64_t *children_nr;
499 for (row = 0; row < tile->
ft_rows; ++row) {
500 for (col = 0; col < tile->
ft_cols; ++col) {
532 for (prev = 1,
i = 1;
i <=
depth; ++
i) {
533 r = idx % (prev * children_nr[
i - 1]);
535 fd_idx[
i] =
r / prev;
536 prev *= children_nr[
i - 1];
538 tidx = fd_idx[
depth];
541 tidx += fd_idx[
i - 1] * children_nr[
i - 1] * prev;
542 prev *= children_nr[
i - 1];
638 uint64_t children_nr;
644 M0_PRE(level < tree->ft_depth);
687 uint64_t children_nr;
689 uint64_t *cache_info;
694 if (cache_info ==
NULL)
706 children_nr =
node->ftn_child_nr;
717 if (cache_len ==
NULL) {
754 cache->fpc_len = len;
764 cache->fpc_inverse = inverse;
769 cache->fpc_lcode = lcode;
771 cache->fpc_omega = ~(uint64_t)0;
857 tile = &
pver->pv_fd_tile;
861 tree_depth =
pver->pv_fd_tile.ft_depth;
862 for (
i = 1, children = 1;
i < tree_depth; ++
i) {
866 rel_vidx[
i] = vidx / children;
877 uint64_t *rel_vidx, uint64_t *tgt_idx)
892 tree = &
pver->pv_fd_tree;
898 rel_idx = rel_vidx[
depth];
902 perm_idx =
cache->fpc_permute[rel_idx];
908 *tgt_idx =
node->ftn_abs_idx;
917 cache_len =
node->ftn_child_nr;
934 for (
i = 0;
i <
cache->fpc_len; ++
i)
942 for (
i = 0;
i <
cache->fpc_len - 1; ++
i)
948 cache->fpc_omega = omega;
977 tile = &
pver->pv_fd_tile;
981 tree_depth =
pver->pv_fd_tree.ft_depth;
982 for (
i = 1, children = 1;
i < tree_depth; ++
i) {
985 for (
i = 1, vidx = 0;
i <= tree_depth; ++
i) {
986 vidx += rel_idx[
i] * children;
991 if (
i > tree_depth) {
1003 uint64_t omega, uint64_t perm_idx,
1017 tree = &
pver->pv_fd_tree;
1032 rel_idx[
depth] =
cache->fpc_inverse[perm_idx];
1033 perm_idx =
node->ftn_rel_idx;
1038 #undef M0_TRACE_SUBSYSTEM const struct m0_conf_obj_type * m0_conf_obj_type(const struct m0_conf_obj *obj)
M0_INTERNAL int m0_fd_tile_build(const struct m0_conf_pver *pv, struct m0_pool_version *pool_ver, uint32_t *failure_level)
#define M0_ALLOC_ARR(arr, nr)
struct m0_fd_tile_cell * ft_cell
const struct m0_conf_obj_type M0_CONF_OBJV_TYPE
static uint64_t units_calc(uint64_t **units, uint64_t level, uint64_t parent_nr, uint64_t child_nr, uint64_t tol)
struct m0_pool_version * l_pver
static struct m0_fd_perm_cache * cache_get(struct m0_pdclust_instance *pi, struct m0_fd_tree_node *node)
M0_INTERNAL int m0_fd__tree_level_populate(const struct m0_conf_pver *pv, struct m0_fd_tree *tree, uint32_t level)
M0_INTERNAL void m0_fd_perm_cache_fini(struct m0_fd_perm_cache *cache)
const struct m0_conf_obj_type M0_CONF_SITE_TYPE
static bool is_objv_ctrl(const struct m0_conf_obj *obj)
M0_INTERNAL int m0_fd_tolerance_check(struct m0_conf_pver *pv, uint32_t *failure_level)
struct m0_pool_version * pv
#define M0_LOG(level,...)
enum m0_trace_level level
uint32_t pv_fd_tol_vec[M0_CONF_PVER_HEIGHT]
static bool is_objv(const struct m0_conf_obj *obj, const struct m0_conf_obj_type *type)
static struct m0_pool_version * pool_ver_get(const struct m0_pdclust_instance *pd_instance)
static struct net_test_cmd_node * node
struct m0_layout_instance pi_base
M0_INTERNAL void m0_uint128_init(struct m0_uint128 *u128, const char *magic)
struct m0_pool_version pool_ver
static void inverse_permuted_idx_get(struct m0_pdclust_instance *pi, uint64_t omega, uint64_t perm_idx, uint64_t *rel_idx)
static bool is_objv_encl(const struct m0_conf_obj *obj)
int32_t ftc_child_abs_idx
M0_INTERNAL int m0_fd__tree_cursor_next(struct m0_fd__tree_cursor *cursor)
M0_INTERNAL void m0_permute(uint64_t n, uint64_t *k, uint64_t *s, uint64_t *r)
#define min_type(t, a, b)
M0_INTERNAL int m0_fd_perm_cache_init(struct m0_fd_perm_cache *cache, uint64_t len)
static int symm_tree_attr_get(const struct m0_conf_pver *pv, uint32_t *depth, uint64_t *children_nr)
M0_INTERNAL int m0_fd__tree_root_create(struct m0_fd_tree *tree, uint64_t root_children)
const struct m0_conf_obj_type M0_CONF_CONTROLLER_TYPE
static void uniform_distribute(uint64_t **units, uint64_t level, uint64_t parent_nr, uint64_t child_nr)
uint64_t ft_child[M0_CONF_PVER_HEIGHT]
static int tolerance_check(const struct m0_conf_pver *pv, uint64_t *children_nr, uint32_t first_level, uint32_t *failure_level)
M0_INTERNAL void m0_fd_tgt_to_src(const struct m0_fd_tile *tile, const struct m0_pdclust_tgt_addr *tgt, struct m0_pdclust_src_addr *src)
M0_INTERNAL int m0_fd_tree_build(const struct m0_conf_pver *pv, struct m0_fd_tree *tree)
static uint64_t tree2pv_level_conv(uint64_t level, uint64_t tree_depth)
M0_INTERNAL void m0_fid_set(struct m0_fid *fid, uint64_t container, uint64_t key)
M0_INTERNAL int m0_conf_walk(int(*fn)(struct m0_conf_obj *obj, void *args), struct m0_conf_obj *origin, void *args)
return M0_ERR(-EOPNOTSUPP)
static void permuted_tgt_get(struct m0_pdclust_instance *pi, uint64_t omega, uint64_t *rel_vidx, uint64_t *tgt_idx)
M0_INTERNAL uint64_t m0_rnd(uint64_t max, uint64_t *seed)
static bool is_objv_rack(const struct m0_conf_obj *obj)
static void cache_info_update(struct m0_fd_cache_info *cache_info, uint64_t cnt)
const struct m0_conf_obj_type M0_CONF_ENCLOSURE_TYPE
static void attr(struct m0_addb2__context *ctx, const uint64_t *v, char *buf)
static struct net_test_cmd_node nodes[NTC_MULTIPLE_NODES]
M0_INTERNAL void m0_fd_tree_destroy(struct m0_fd_tree *tree)
struct m0_fd_tree_node * ftc_node
struct m0_fd_tile pv_fd_tile
static uint64_t fault_tolerant_idx_get(uint64_t idx, uint64_t *children_nr, uint64_t depth)
struct m0_fd_cache_info ft_cache_info
static uint32_t m0_conf_dir_len(const struct m0_conf_dir *dir)
static int min_children_get(struct m0_conf_obj *obj, void *arg)
void * m0_alloc(size_t size)
M0_INTERNAL bool m0_conf_cache_is_locked(const struct m0_conf_cache *cache)
struct m0_pdclust_instance pi
const struct m0_conf_obj_type M0_CONF_DRIVE_TYPE
static bool is_objv_disk(const struct m0_conf_obj *obj)
M0_INTERNAL void m0_fd_bwd_map(struct m0_pdclust_instance *pi, const struct m0_pdclust_tgt_addr *tgt, struct m0_pdclust_src_addr *src)
#define pv_for(pv, level, obj, rc)
#define M0_CONF_CAST(ptr, type)
M0_INTERNAL uint64_t m0_gcd64(uint64_t p, uint64_t q)
static int objs_of_level_count(struct m0_conf_obj *obj, void *arg)
M0_INTERNAL bool m0_fid_eq(const struct m0_fid *fid0, const struct m0_fid *fid1)
#define m0_forall(var, nr,...)
static uint64_t m0_enc(uint64_t width, uint64_t row, uint64_t column)
struct m0_pdclust_tgt_addr tgt
struct m0_fd_tree_node * ft_root
static bool fd_tile_invariant(const struct m0_fd_tile *tile)
static void m0_dec(uint64_t width, uint64_t pos, uint64_t *row, uint64_t *column)
static bool(* is_obj_at_level[M0_CONF_PVER_HEIGHT])(const struct m0_conf_obj *obj)
struct m0_fd_perm_cache * pi_perm_cache
M0_INTERNAL int m0_fd__tree_node_init(struct m0_fd_tree *tree, struct m0_fd_tree_node *node, uint16_t child_nr, const struct m0_fd__tree_cursor *cursor)
static bool is_cache_valid(const struct m0_fd_perm_cache *cache, uint64_t omega, const struct m0_fid *gfid)
static void permute(uint32_t n, uint32_t *k, uint32_t *s, uint32_t *r)
M0_INTERNAL int m0_fd__perm_cache_build(struct m0_fd_tree *tree)
M0_INTERNAL void m0_fd__tree_node_fini(struct m0_fd_tree *tree, struct m0_fd_tree_node *node)
struct m0_conf_dir * cv_children
static uint64_t parity_group_size(const struct m0_pdclust_attr *la_attr)
M0_INTERNAL void m0_fd_tile_destroy(struct m0_fd_tile *tile)
M0_INTERNAL void m0_fd__tile_populate(struct m0_fd_tile *tile)
M0_INTERNAL void m0_fd_src_to_tgt(const struct m0_fd_tile *tile, const struct m0_pdclust_src_addr *src, struct m0_pdclust_tgt_addr *tgt)
M0_INTERNAL int m0_fd__tile_init(struct m0_fd_tile *tile, const struct m0_pdclust_attr *la_attr, uint64_t *children, uint64_t depth)
M0_INTERNAL void m0_array_sort(uint64_t *arr, uint64_t arr_len)
M0_INTERNAL void m0_fd_fwd_map(struct m0_pdclust_instance *pi, const struct m0_pdclust_src_addr *src, struct m0_pdclust_tgt_addr *tgt)
M0_INTERNAL void m0_conf_cache_lock(struct m0_conf_cache *cache)
struct m0_pdclust_tgt_addr ftc_tgt
static void fd_permute(struct m0_fd_perm_cache *cache, struct m0_uint128 *seed, struct m0_fid *gfid, uint64_t omega)
struct m0_pdclust_attr pv_attr
M0_INTERNAL int m0_fd__tree_cursor_init_at(struct m0_fd__tree_cursor *cursor, const struct m0_fd_tree *tree, const struct m0_fd_tree_node *node, uint32_t child_idx)
struct m0_pdclust_src_addr src
struct m0_pdclust_src_addr ftc_src
static bool is_objv_site(const struct m0_conf_obj *obj)
M0_INTERNAL int m0_fd__tree_cursor_init(struct m0_fd__tree_cursor *cursor, const struct m0_fd_tree *tree, uint16_t depth)
M0_INTERNAL void m0_conf_cache_unlock(struct m0_conf_cache *cache)
const struct m0_conf_obj_type M0_CONF_RACK_TYPE
M0_INTERNAL struct m0_fd_tree_node ** m0_fd__tree_cursor_get(struct m0_fd__tree_cursor *cursor)
M0_INTERNAL void m0_fd__perm_cache_destroy(struct m0_fd_tree *tree)
M0_INTERNAL uint64_t m0_hash(uint64_t x)
static uint64_t pool_width_calc(uint64_t *children_nr, uint64_t depth)