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)