23 #define M0_TRACE_SUBSYSTEM M0_TRACE_SUBSYS_DIXCM 82 .sd_name =
"self-lock",
86 .sd_name =
"ctidx-first-key",
90 .sd_name =
"ctidx-reposition",
94 .sd_name =
"ctidx-next",
98 .sd_name =
"next-cctg",
104 .sd_name =
"meta-lock",
108 .sd_name =
"cctg-meta-lookup",
115 .sd_name =
"cctg-first-record",
119 .sd_name =
"cctg-cur-next",
123 .sd_name =
"next-key",
130 .sd_name =
"idle-start",
135 .sd_name =
"del_tx_opened",
139 .sd_name =
"del_tx_wait",
143 .sd_name =
"del_tx_done",
147 .sd_name =
"idle-fin",
151 .sd_name =
"del-check",
156 .sd_name =
"cctg-continue",
160 .sd_name =
"end-of-iterator",
168 .sd_name =
"failure",
206 return src->b_nob >= cutoff ?
335 &layout->
u.dl_desc.ld_pver);
336 return &
pver->pv_mach;
357 &layout->
u.dl_desc.ld_pver);
359 &layout->
u.dl_desc,
key);
364 uint64_t *group_tgts,
365 uint64_t group_tgts_nr,
376 for (
i = 0;
i < group_tgts_nr;
i++) {
377 if (group_tgts[
i] ==
tgt) {
383 if (
i == group_tgts_nr)
392 uint64_t *group_tgts,
393 uint64_t group_tgts_nr,
396 uint64_t spare_id_loc;
398 uint64_t device_index;
400 bool has_data =
false;
407 spare_id_loc = spare_id;
422 if (group_tgts[unit] != device_index)
429 device_index = spare_usage_array[spare_id_loc].
457 if (spare_usage_array[spare_id_loc].psu_device_state !=
462 }
while (spare_id_loc > 0);
469 uint64_t *group_tgts,
470 uint64_t group_tgts_nr,
479 uint64_t device_index;
480 uint64_t spare_id_loc;
483 bool has_data =
false;
484 bool is_first_cycle =
true;
492 spare_id_loc = spare_id;
497 if (!is_first_cycle) {
499 unit = spare_id_loc +
N + K;
500 if (group_tgts[unit] != device_index) {
504 is_first_cycle =
false;
509 device_index = spare_usage_array[spare_id_loc].
533 if (spare_usage_array[spare_id_loc].psu_device_state ==
539 tgt_tmp = device_index;
551 }
while (spare_id_loc > 0);
553 if (is_set && has_data) {
577 uint64_t *group_tgts;
578 uint64_t group_tgts_nr;
579 uint64_t device_index;
580 uint32_t device_state;
582 uint64_t tgts_nr_loc;
611 if (group_tgts ==
NULL)
615 units_nr = group_tgts_nr;
617 while (unit < units_nr) {
619 group_tgts[unit] = tgt_tmp;
633 if (tgts_loc ==
NULL) {
647 for (
i = 0;
i < spare_nr;
i++) {
650 device_state = spare_usage_array[spare_id].psu_device_state;
660 !
m0_exists(j, group_tgts_nr, group_tgts[j] == device_index))
680 group_tgts_nr, spare_id))
684 tgts_loc[tgts_nr_loc] = tgt_tmp;
691 if (
rc == 0 && tgts_nr_loc > 0) {
693 *tgts_nr = tgts_nr_loc;
702 uint64_t local_device,
717 " (pool dev_id/global dev_id):",
718 be64toh(*(uint64_t *)
key->b_addr));
719 M0_LOG(
M0_DEBUG,
"=============================================");
720 while (unit < units_nr) {
722 M0_ASSERT(tgt < pm->pm_state->pst_nr_devices);
728 units_nr > 10 ? (unit < 10 ?
" " :
"") :
"",
741 M0_LOG(
M0_DEBUG,
"=============================================");
750 uint32_t max_device_failures;
763 "Spare usage array info (pool dev_id/global dev_id):");
764 M0_LOG(
M0_DEBUG,
"=============================================");
765 for (
i = 0;
i < spare_nr;
i++) {
768 state = spare_usage_array[
i].psu_device_state;
771 "%u: dev_id: %" PRIu64 "/%u, %s, served by:",
781 M0_ASSERT(tgt < pm->pm_state->pst_nr_devices);
785 "%s dev_id: %" PRIu64 "/%u, %s",
786 max_device_failures > 10 ?
" " :
" ",
791 M0_LOG(
M0_DEBUG,
"=============================================");
805 " (pool dev_id/global dev_id):",
806 be64toh(*(uint64_t *)
key->b_addr));
807 M0_LOG(
M0_DEBUG,
"=============================================");
808 for (
i = 0;
i < tgts_nr;
i++) {
813 tgts_nr > 10 ? (
i < 10 ?
" " :
"") :
"",
817 M0_LOG(
M0_DEBUG,
"=============================================");
845 while (unit < units_nr) {
848 M0_ASSERT(tgt < pm->pm_state->pst_nr_devices);
865 uint64_t local_device,
867 bool *is_coordinator,
875 uint64_t *group_tgts;
876 uint64_t group_tgts_nr;
882 *is_coordinator =
false;
890 if (group_tgts ==
NULL)
893 units_nr = group_tgts_nr;
895 for (unit = 0; unit < units_nr; unit++) {
897 group_tgts[unit] = tgt_tmp;
902 for (unit = 0; unit < units_nr; unit++) {
904 M0_ASSERT(tgt < pm->pm_state->pst_nr_devices);
921 group_tgts, group_tgts_nr,
924 M0_ASSERT(*tgts_nr == 0 || *tgts_nr == 1);
925 if (
rc == 0 && *tgts_nr > 0) {
927 *is_coordinator =
true;
933 (
int)*is_coordinator,
934 be64toh(*(uint64_t *)
key->b_addr));
943 uint64_t local_device,
945 bool *is_coordinator,
953 be64toh(*(uint64_t *)
key->b_addr));
964 bool *is_coordinator)
970 uint64_t local_device;
972 uint64_t *tgts =
NULL;
973 uint64_t tgts_nr = 0;
992 pm, local_device,
key);
1003 (iter, &layout_iter, pm, local_device,
key, is_coordinator,
1006 if (
rc == 0 && *is_coordinator && tgts_nr > 0) {
1038 uint8_t min_key = 0;
1044 bool is_coordinator =
false;
1045 bool is_same_key =
false;
1049 M0_ENTRY(
"fom %p, dix_cm %p, phase %d(%s)",
1105 }
else if (
rc == -ENOENT) {
1199 struct m0_buf tmp_key = {};
1200 struct m0_buf tmp_val = {};
1217 if (
rc == 0 && (is_same_key || !is_coordinator ||
1231 else if (
rc == -ENOENT) {
1265 &
fom->fo_loc->fl_group);
1401 return M0_RC(result);
1539 uint64_t *cctg_proc_recs_nr)
1547 uint64_t *proc_recs_nr)
1552 #undef M0_TRACE_SUBSYSTEM M0_INTERNAL int m0_buf_copy_aligned(struct m0_buf *dst, const struct m0_buf *src, unsigned shift)
static const struct m0_fom_ops dix_cm_iter_fom_ops
static struct m0_sm_state_descr dix_cm_iter_phases[]
struct m0_poolmach_state * pm_state
M0_INTERNAL void m0_long_lock_link_init(struct m0_long_lock_link *link, struct m0_fom *fom, struct m0_long_lock_addb2 *addb2)
static void tgts_print(struct m0_dix_layout_iter *iter, uint64_t *tgts, uint64_t tgts_nr, struct m0_buf *key)
M0_INTERNAL void m0_ctg_delete_credit(struct m0_cas_ctg *ctg, m0_bcount_t knob, m0_bcount_t vnob, struct m0_be_tx_credit *accum)
struct m0_be_domain * bs_domain
M0_INTERNAL void m0_fom_wakeup(struct m0_fom *fom)
#define M0_ALLOC_ARR(arr, nr)
static void dix_cm_iter_fini(struct m0_dix_cm_iter *iter)
M0_INTERNAL void m0_dix_cm_iter_cur_pos(struct m0_dix_cm_iter *iter, struct m0_fid *cctg_fid, uint64_t *cctg_proc_recs_nr)
M0_INTERNAL void m0_dix_fid_convert_cctg2dix(const struct m0_fid *cctg_fid, struct m0_fid *dix_fid)
struct m0_buf di_prev_key
M0_INTERNAL void m0_chan_broadcast_lock(struct m0_chan *chan)
M0_INTERNAL uint32_t m0_dix_liter_K(struct m0_dix_layout_iter *iter)
#define M0_FOM_LONG_LOCK_RETURN(rc)
M0_INTERNAL void m0_clink_init(struct m0_clink *link, m0_chan_cb_t cb)
M0_INTERNAL int m0_ctg_delete(struct m0_ctg_op *ctg_op, struct m0_cas_ctg *ctg, const struct m0_buf *key, int next_phase)
static struct m0_sm_trans_descr dix_cm_iter_trans[]
M0_INTERNAL void m0_clink_del_lock(struct m0_clink *link)
static void dix_cm_iter_next_ast_cb(struct m0_sm_group *grp, struct m0_sm_ast *ast)
void(* sa_cb)(struct m0_sm_group *grp, struct m0_sm_ast *)
struct m0_cm_type * dct_base
const m0_time_t M0_TIME_NEVER
M0_INTERNAL struct m0_pool_version * m0_pool_version_find(struct m0_pools_common *pc, const struct m0_fid *id)
M0_INTERNAL bool m0_buf_eq(const struct m0_buf *x, const struct m0_buf *y)
M0_INTERNAL void m0_dix_cm_iter_next(struct m0_dix_cm_iter *iter)
M0_INTERNAL struct m0_long_lock * m0_ctg_lock(struct m0_cas_ctg *ctg)
static struct m0_sm_group * grp
#define M0_LOG(level,...)
struct m0_clink di_meta_clink
static struct m0_be_tx_credit * m0_fom_tx_credit(struct m0_fom *fom)
struct m0_sm_group fl_group
M0_INTERNAL void m0_sm_ast_post(struct m0_sm_group *grp, struct m0_sm_ast *ast)
struct m0_dix_linst dit_linst
static bool dix_cm_is_repair_coordinator(struct m0_dix_layout_iter *iter, struct m0_poolmach *pm, uint64_t local_dev)
M0_INTERNAL void m0_dtx_init(struct m0_dtx *tx, struct m0_be_domain *be_domain, struct m0_sm_group *sm_group)
static int dix_cm_iter_dtx_failure(struct m0_dix_cm_iter *iter)
int(* fto_create)(struct m0_fop *fop, struct m0_fom **out, struct m0_reqh *reqh)
M0_INTERNAL void m0_dtx_opened(struct m0_dtx *tx)
struct m0_long_lock_addb2 di_meta_lock_addb2
static void parity_group_print(struct m0_dix_layout_iter *iter, struct m0_poolmach *pm, uint64_t local_device, struct m0_buf *key)
M0_INTERNAL int m0_dix_layout_iter_init(struct m0_dix_layout_iter *iter, const struct m0_fid *index, struct m0_layout_domain *ldom, struct m0_pool_version *pver, struct m0_dix_ldesc *ldesc, struct m0_buf *key)
struct m0_ctg_op di_ctg_op
struct m0_be_chan cc_chan
#define m0_exists(var, nr,...)
static int dix_cm_rebalance_tgts_get(struct m0_dix_layout_iter *iter, struct m0_poolmach *pm, uint64_t *group_tgts, uint64_t group_tgts_nr, uint64_t spare_id, uint64_t **tgts, uint64_t *tgts_nr)
M0_INTERNAL void m0_fom_wait_on(struct m0_fom *fom, struct m0_chan *chan, struct m0_fom_callback *cb)
M0_INTERNAL void m0_long_write_unlock(struct m0_long_lock *lock, struct m0_long_lock_link *link)
M0_INTERNAL int m0_pageshift_get(void)
M0_INTERNAL int m0_dix_cm_iter_start(struct m0_dix_cm_iter *iter, struct m0_dix_cm_type *dcmt, struct m0_reqh *reqh, m0_bcount_t rpc_cutoff)
#define container_of(ptr, type, member)
M0_INTERNAL int m0_ctg_cursor_get(struct m0_ctg_op *ctg_op, const struct m0_buf *key, int next_phase)
struct m0_fid di_prev_cctg_fid
static int dix_cm_repair_tgts_get(struct m0_dix_layout_iter *iter, struct m0_poolmach *pm, uint64_t **tgts, uint64_t *tgts_nr)
struct m0_long_lock_link di_meta_lock_link
static int dix_cm_iter_fom_tick(struct m0_fom *fom)
static int dix_cm_iter_failure(struct m0_dix_cm_iter *iter, int rc)
static struct m0_be_tx * m0_fom_tx(struct m0_fom *fom)
const struct m0_fom_type * fo_type
M0_INTERNAL void m0_dix_layout_iter_fini(struct m0_dix_layout_iter *iter)
struct m0_pooldev * pst_devices_array
struct m0_long_lock_link di_lock_link
static struct m0_sm_ast ast[NR]
static int dix_cm_iter_rebalance_tgts_get(struct m0_dix_cm_iter *iter, struct m0_dix_layout_iter *liter, struct m0_poolmach *pm, uint64_t local_device, struct m0_buf *key, bool *is_coordinator, uint64_t **tgts, uint64_t *tgts_nr)
M0_INTERNAL int m0_ctg_cursor_next(struct m0_ctg_op *ctg_op, int next_phase)
M0_INTERNAL int m0_ctg_meta_lookup(struct m0_ctg_op *ctg_op, const struct m0_fid *fid, int next_phase)
uint64_t di_cctg_processed_recs_nr
void m0_fom_init(struct m0_fom *fom, const struct m0_fom_type *fom_type, const struct m0_fom_ops *ops, struct m0_fop *fop, struct m0_fop *reply, struct m0_reqh *reqh)
static void dix_cm_iter_stop_ast_cb(struct m0_sm_group *grp, struct m0_sm_ast *ast)
M0_INTERNAL bool m0_long_write_lock(struct m0_long_lock *lk, struct m0_long_lock_link *link, int next_phase)
M0_INTERNAL bool m0_fom_is_waiting(const struct m0_fom *fom)
M0_INTERNAL void m0_ctg_cursor_fini(struct m0_ctg_op *ctg_op)
static int dix_cm_iter_repair_tgts_get(struct m0_dix_cm_iter *iter, struct m0_dix_layout_iter *liter, struct m0_poolmach *pm, uint64_t local_device, struct m0_buf *key, bool *is_coordinator, uint64_t **tgts, uint64_t *tgts_nr)
static const struct m0_fom_type_ops dix_cm_iter_fom_type_ops
static int dix_cm_iter_idle(struct m0_dix_cm_iter *iter)
struct m0_long_lock_addb2 di_lock_addb2
M0_INTERNAL bool m0_long_lock(struct m0_long_lock *lock, bool write, struct m0_long_lock_link *link, int next_phase)
static void dix_cm_iter_fom_fini(struct m0_fom *fom)
M0_INTERNAL void m0_dix_cm_iter_type_register(struct m0_dix_cm_type *dcmt)
return M0_ERR(-EOPNOTSUPP)
static void dix_cm_iter_tgts_fini(struct m0_dix_cm_iter *iter)
static uint64_t dix_cm_iter_fom_locality(const struct m0_fom *fom)
M0_INTERNAL const char * m0_pool_dev_state_to_str(enum m0_pool_nd_state state)
#define M0_AMB(obj, ptr, field)
M0_INTERNAL void m0_dtx_open(struct m0_dtx *tx)
M0_INTERNAL struct m0_cas_ctg * m0_ctg_meta(void)
M0_INTERNAL void m0_long_unlock(struct m0_long_lock *lock, struct m0_long_lock_link *link)
void m0_fom_fini(struct m0_fom *fom)
M0_EXTERN struct m0_dix_cm_type dix_rebalance_dcmt
M0_INTERNAL void m0_chan_init(struct m0_chan *chan, struct m0_mutex *ch_guard)
static int dix_cm_tgt_to_unit(uint64_t tgt, uint64_t *group_tgts, uint64_t group_tgts_nr, uint64_t *unit)
M0_INTERNAL void m0_dix_layout_iter_next(struct m0_dix_layout_iter *iter, uint64_t *tgt)
static const struct m0_sm_conf dix_cm_iter_sm_conf
static struct m0_be_seg * be_seg
M0_INTERNAL void m0_dix_cm_iter_stop(struct m0_dix_cm_iter *iter)
void m0_fom_phase_move(struct m0_fom *fom, int32_t rc, int phase)
M0_INTERNAL void m0_long_lock_link_fini(struct m0_long_lock_link *link)
M0_INTERNAL void m0_fom_type_init(struct m0_fom_type *type, uint64_t id, const struct m0_fom_type_ops *ops, const struct m0_reqh_service_type *svc_type, const struct m0_sm_conf *sm)
struct m0_ctg_op di_ctidx_op
M0_INTERNAL uint32_t m0_dix_liter_unit_classify(struct m0_dix_layout_iter *iter, uint64_t unit)
M0_INTERNAL void m0_mutex_init(struct m0_mutex *mutex)
M0_INTERNAL void m0_dtx_fini(struct m0_dtx *tx)
M0_EXTERN struct m0_dix_cm_type dix_repair_dcmt
M0_INTERNAL uint32_t m0_dix_liter_W(struct m0_dix_layout_iter *iter)
struct m0_cas_ctg * di_cctg
struct m0_layout_domain rh_ldom
uint64_t di_processed_recs_nr
M0_INTERNAL uint32_t m0_dix_fid_cctg_device_id(const struct m0_fid *cctg_fid)
M0_INTERNAL void m0_buf_free(struct m0_buf *buf)
M0_INTERNAL void m0_ctg_cursor_init(struct m0_ctg_op *ctg_op, struct m0_cas_ctg *ctg)
static void dix_cm_iter_init(struct m0_dix_cm_iter *iter)
struct m0_dix_ldesc di_ldesc
M0_INTERNAL void m0_dtx_done(struct m0_dtx *tx)
union m0_dix_layout::@145 u
M0_INTERNAL int m0_dix_cm_iter_get(struct m0_dix_cm_iter *iter, struct m0_buf *key, struct m0_buf *val, uint32_t *sdev_id)
M0_INTERNAL int m0_buf_copy(struct m0_buf *dest, const struct m0_buf *src)
M0_INTERNAL void m0_ctg_op_init(struct m0_ctg_op *ctg_op, struct m0_fom *fom, uint32_t flags)
M0_INTERNAL void m0_dix_layout_iter_reset(struct m0_dix_layout_iter *iter)
M0_INTERNAL bool m0_fid_eq(const struct m0_fid *fid0, const struct m0_fid *fid1)
M0_INTERNAL int m0_fom_timedwait(struct m0_fom *fom, uint64_t phases, m0_time_t deadline)
void m0_clink_add_lock(struct m0_chan *chan, struct m0_clink *link)
static bool dix_cm_repair_spare_has_data(struct m0_dix_layout_iter *iter, struct m0_poolmach *pm, uint64_t *group_tgts, uint64_t group_tgts_nr, uint64_t spare_id)
struct m0_pdclust_tgt_addr tgt
struct m0_long_lock_link di_del_lock_link
struct m0_mutex di_ch_guard
M0_INTERNAL void m0_ctg_cursor_kv_get(struct m0_ctg_op *ctg_op, struct m0_buf *key, struct m0_buf *val)
#define M0_BUF_INIT_PTR(p)
#define M0_FI_ENABLED(tag)
static int dix_cm_iter_eof(struct m0_dix_cm_iter *iter)
struct m0_fom_locality * fo_loc
uint32_t psu_device_index
struct m0_dix_cm_type * dcm_type
struct m0_fom_type dct_iter_fomt
struct m0_reqh_service cm_service
M0_INTERNAL void m0_dix_layout_iter_goto(struct m0_dix_layout_iter *iter, uint64_t unit)
static void dix_cm_iter_dtx_fini(struct m0_dix_cm_iter *iter)
struct m0_long_lock_addb2 di_del_lock_addb2
M0_INTERNAL uint32_t m0_dix_liter_N(struct m0_dix_layout_iter *iter)
M0_INTERNAL int m0_fom_rc(const struct m0_fom *fom)
M0_INTERNAL void m0_mutex_fini(struct m0_mutex *mutex)
M0_INTERNAL void m0_clink_fini(struct m0_clink *link)
struct m0_pools_common * rh_pools
uint32_t psu_device_index
uint32_t pst_max_device_failures
M0_INTERNAL void m0_rwlock_read_lock(struct m0_rwlock *lock)
struct m0_be_seg * rh_beseg
M0_INTERNAL void m0_dix_cm_iter_processed_num(struct m0_dix_cm_iter *iter, uint64_t *proc_recs_nr)
struct m0_reqh_service_type ct_stype
M0_INTERNAL void m0_fom_queue(struct m0_fom *fom)
struct m0_fid di_cctg_fid
M0_INTERNAL struct m0_cas_ctg * m0_ctg_ctidx(void)
void(* fo_fini)(struct m0_fom *fom)
struct m0_ctg_op di_ctg_del_op
M0_INTERNAL void m0_ctg_op_fini(struct m0_ctg_op *ctg_op)
static int dix_cm_layout_iter_init(struct m0_dix_layout_iter *iter, const struct m0_fid *index, struct m0_dix_layout *layout, struct m0_dix_cm *dix_cm, struct m0_buf *key)
static int dix_cm_iter_buf_copy(struct m0_buf *dst, struct m0_buf *src, m0_bcount_t cutoff)
M0_INTERNAL void m0_rwlock_read_unlock(struct m0_rwlock *lock)
M0_INTERNAL void m0_long_read_unlock(struct m0_long_lock *lock, struct m0_long_lock_link *link)
M0_INTERNAL bool m0_long_read_lock(struct m0_long_lock *lk, struct m0_long_lock_link *link, int next_phase)
void m0_fom_phase_set(struct m0_fom *fom, int phase)
M0_INTERNAL void m0_chan_fini_lock(struct m0_chan *chan)
#define M0_BUF_INIT(size, data)
struct m0_pdclust_src_addr src
static struct m0_poolmach * dix_cm_pm_get(struct m0_dix_cm *dix_cm, struct m0_dix_layout *layout)
struct m0_pool_spare_usage * pst_spare_usage_array
struct m0_chan di_completed
static void dix_cm_iter_meta_unlock(struct m0_dix_cm_iter *iter)
M0_INTERNAL struct m0_pooldev * m0_dix_tgt2sdev(struct m0_dix_linst *linst, uint64_t tgt)
M0_INTERNAL int m0_ctg_op_rc(struct m0_ctg_op *ctg_op)
static int dix_cm_iter_next_key(struct m0_dix_cm_iter *iter, struct m0_buf *key, struct m0_buf *val, bool *is_coordinator)
struct m0_dix_cm_iter dcm_it
static bool dix_cm_iter_meta_clink_cb(struct m0_clink *cl)
M0_INTERNAL struct m0_long_lock * m0_ctg_del_lock(void)
M0_INTERNAL struct m0_reqh * m0_fom_reqh(const struct m0_fom *fom)
static void spare_usage_print(struct m0_dix_layout_iter *iter, struct m0_poolmach *pm)
M0_INTERNAL const char * m0_fom_phase_name(const struct m0_fom *fom, int phase)
M0_INTERNAL struct m0_cas_ctg * m0_ctg_meta_lookup_result(struct m0_ctg_op *ctg_op)
#define M0_IMPOSSIBLE(fmt,...)