Motr  M0
cm_utils.c
Go to the documentation of this file.
1 /* -*- C -*- */
2 /*
3  * Copyright (c) 2013-2021 Seagate Technology LLC and/or its Affiliates
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * For any questions about this software or licensing,
18  * please email opensource@seagate.com or cortx-questions@seagate.com.
19  *
20  */
21 
22 
23 #define M0_TRACE_SUBSYSTEM M0_TRACE_SUBSYS_SNSCM
24 #include "lib/misc.h"
25 #include "lib/trace.h"
26 #include "lib/finject.h"
27 #include "lib/hash.h"
28 
29 #include "cob/cob.h"
30 #include "motr/setup.h"
31 #include "ioservice/io_service.h"
32 #include "conf/helpers.h" /* m0_conf_service_get */
33 
34 #include "pool/pool.h"
35 #include "sns/parity_repair.h"
36 #include "sns/cm/ag.h"
37 #include "sns/cm/iter.h"
38 #include "sns/cm/cm_utils.h"
39 #include "sns/cm/file.h"
40 #include "ioservice/fid_convert.h" /* m0_fid_cob_device_id */
41 #include "rpc/rpc_machine.h" /* m0_rpc_machine_ep */
42 #include "fd/fd.h" /* m0_fd_fwd_map */
43 
50 /* Start of UT specific code. */
51 enum {
57 #ifdef CONFIG_X86_64
58  SNS_DEFAULT_LAYOUT_ID = 1,
59 #elif defined (CONFIG_AARCH64)
60  SNS_DEFAULT_LAYOUT_ID = 5,
61 #else
62 #error "The platform is not supported"
63 #endif
64  SNS_DEFAULT_UNIT_SIZE = 1 << (11 + SNS_DEFAULT_LAYOUT_ID),
65 };
66 
67 M0_INTERNAL int
69 {
70  struct m0_sns_cm *scm = fctx->sf_scm;
71  struct m0_layout_linear_attr lattr;
72  struct m0_pdclust_attr plattr;
73  struct m0_pdclust_layout *pl = 0;
74  struct m0_layout_linear_enum *le;
75  struct m0_pool *p;
76  struct m0_pool_version *pver;
77  struct m0_reqh *reqh;
78  uint64_t lid;
79  int rc = 0;
80 
82  p = pools_tlist_head(&reqh->rh_pools->pc_pools);
83  pver = pool_version_tlist_head(&p->po_vers);
84  lid = m0_hash(m0_fid_hash(&pver->pv_id) + SNS_DEFAULT_LAYOUT_ID);
85  fctx->sf_pm = &pver->pv_mach;
87  if (fctx->sf_layout != NULL)
88  goto out;
89  lattr.lla_nr = SNS_DEFAULT_P;
90  lattr.lla_A = 1;
91  lattr.lla_B = 1;
92  rc = m0_linear_enum_build(&reqh->rh_ldom, &lattr, &le);
93  if (rc == 0) {
94  lid = SNS_DEFAULT_LAYOUT_ID;
95  plattr.pa_N = SNS_DEFAULT_N;
96  plattr.pa_K = SNS_DEFAULT_K;
97  plattr.pa_S = SNS_DEFAULT_S;
98  plattr.pa_P = SNS_DEFAULT_P;
100  m0_uint128_init(&plattr.pa_seed, "upjumpandpumpim,");
101  rc = m0_pdclust_build(&reqh->rh_ldom, lid, &plattr,
102  &le->lle_base, &pl);
103  if (rc != 0) {
105  return M0_RC(rc);
106  }
107  }
109 out:
111 
112  return M0_RC(rc);
113 }
114 
115 /* End of UT specific code. */
116 
118  const struct m0_pdclust_src_addr *sa,
119  struct m0_pdclust_tgt_addr *ta,
120  struct m0_fid *cfid_out)
121 {
122  m0_sns_cm_file_fwd_map(fctx, sa, ta);
123  m0_poolmach_gob2cob(fctx->sf_pm, &fctx->sf_fid, ta->ta_obj, cfid_out);
124 }
125 
126 M0_INTERNAL uint32_t m0_sns_cm_device_index_get(uint64_t group,
127  uint64_t unit_number,
128  struct m0_sns_cm_file_ctx *fctx)
129 {
130  struct m0_pdclust_src_addr sa;
131  struct m0_pdclust_tgt_addr ta;
132 
133  M0_SET0(&sa);
134  M0_SET0(&ta);
135 
136  sa.sa_group = group;
137  sa.sa_unit = unit_number;
138  m0_sns_cm_file_fwd_map(fctx, &sa, &ta);
139  M0_LEAVE("index:%d", (int)ta.ta_obj);
140  return ta.ta_obj;
141 }
142 
143 M0_INTERNAL uint64_t m0_sns_cm_ag_unit2cobindex(struct m0_sns_cm_ag *sag,
144  uint64_t unit)
145 {
146  struct m0_pdclust_src_addr sa;
147  struct m0_pdclust_tgt_addr ta;
148  struct m0_sns_cm_file_ctx *fctx = sag->sag_fctx;
149 
151  sa.sa_unit = unit;
152  m0_sns_cm_file_fwd_map(fctx, &sa, &ta);
153  return ta.ta_frame *
155 }
156 
157 M0_INTERNAL int m0_sns_cm_cob_locate(struct m0_cob_domain *cdom,
158  const struct m0_fid *cob_fid)
159 {
160  struct m0_cob *cob;
161  struct m0_cob_oikey oikey;
162  int rc;
163 
164  M0_ENTRY("dom=%p cob="FID_F, cdom, FID_P(cob_fid));
165 
166  m0_cob_oikey_make(&oikey, cob_fid, 0);
167  rc = m0_cob_locate(cdom, &oikey, M0_CA_NSKEY_FREE, &cob);
168  if (rc == 0) {
170  m0_cob_put(cob);
171  }
172 
173  return M0_RC(rc);
174 }
175 
176 M0_INTERNAL uint64_t m0_sns_cm_ag_nr_local_units(struct m0_sns_cm *scm,
177  struct m0_sns_cm_file_ctx *fctx,
178  uint64_t group)
179 {
180  struct m0_pdclust_src_addr sa;
181  struct m0_pdclust_tgt_addr ta;
182  struct m0_fid cobfid;
183  uint64_t nrlu = 0;
184  struct m0_poolmach *pm;
185  struct m0_pdclust_layout *pl;
187  int i;
188  int start;
189  int end;
190 
191  M0_ENTRY();
192 
193  M0_PRE(scm != NULL && fctx != NULL);
194 
197  end = m0_sns_cm_ag_unit_end(scm, pl);
198  sa.sa_group = group;
199  pm = fctx->sf_pm;
200  for (i = start; i < end; ++i) {
201  sa.sa_unit = i;
202  m0_sns_cm_unit2cobfid(fctx, &sa, &ta, &cobfid);
204  if (M0_IN(ut, (M0_SNS_CM_UNIT_LOCAL, M0_SNS_CM_UNIT_HOLE_EOF)) &&
205  !scm->sc_helpers->sch_is_cob_failed(pm, ta.ta_obj) &&
207  M0_CNT_INC(nrlu);
208  }
209  M0_LEAVE("number of local units = %"PRId64, nrlu);
210 
211  return nrlu;
212 }
213 
214 M0_INTERNAL
216  struct m0_pdclust_layout *pl)
217 {
218  return m0_pdclust_N(pl) + m0_pdclust_K(pl);
219 }
220 
221 M0_INTERNAL
223 {
224  return m0_pdclust_N(pl);
225 }
226 
227 M0_INTERNAL
229 {
230  return m0_pdclust_K(pl);
231 }
232 
233 M0_INTERNAL
235 {
236  return m0_pdclust_S(pl);
237 }
238 
239 M0_INTERNAL uint64_t m0_sns_cm_ag_size(const struct m0_pdclust_layout *pl)
240 {
241  return m0_sns_cm_ag_nr_data_units(pl) +
244 }
245 
246 M0_INTERNAL bool m0_sns_cm_is_cob_repaired(struct m0_poolmach *pm,
247  uint32_t cob_index)
248 {
249  enum m0_pool_nd_state state_out = 0;
250  M0_PRE(pm != NULL);
251 
252  m0_poolmach_device_state(pm, cob_index, &state_out);
253  return state_out == M0_PNDS_SNS_REPAIRED;
254 }
255 
256 M0_INTERNAL bool m0_sns_cm_is_cob_repairing(struct m0_poolmach *pm,
257  uint32_t cob_index)
258 {
259  enum m0_pool_nd_state state_out = 0;
260  M0_PRE(pm != NULL);
261 
262  m0_poolmach_device_state(pm, cob_index, &state_out);
263  return state_out == M0_PNDS_SNS_REPAIRING;
264 }
265 
266 M0_INTERNAL bool m0_sns_cm_is_cob_rebalancing(struct m0_poolmach *pm,
267  uint32_t cob_index)
268 {
269  enum m0_pool_nd_state state_out = 0;
270  M0_PRE(pm != NULL);
271 
272  m0_poolmach_device_state(pm, cob_index, &state_out);
273 
274  return state_out == M0_PNDS_SNS_REBALANCING;
275 }
276 
278  uint64_t group_nr, uint64_t spare_nr)
279 {
280  uint64_t data_unit_id_out;
281  struct m0_fid cobfid;
282  struct m0_pdclust_src_addr sa;
283  struct m0_pdclust_tgt_addr ta;
284  struct m0_poolmach *pm;
285  struct m0_pdclust_instance *pi;
286  struct m0_pdclust_layout *pl;
287  enum m0_pool_nd_state state_out = 0;
288  bool result = true;
289  int rc;
290 
291  M0_ENTRY("index:%d", (int)spare_nr);
292 
294  pi = fctx->sf_pi;
295  pm = fctx->sf_pm;
296  if (m0_pdclust_unit_classify(pl, spare_nr) == M0_PUT_SPARE) {
297  /*
298  * Firstly, check if the device corresponding to the given spare
299  * unit is already repaired. If yes then the spare unit is empty
300  * or the data is already moved. So we need not repair the spare
301  * unit.
302  */
303  M0_SET0(&sa);
304  M0_SET0(&ta);
305  sa.sa_unit = spare_nr;
306  sa.sa_group = group_nr;
307  m0_sns_cm_unit2cobfid(fctx, &sa, &ta, &cobfid);
308  rc = m0_poolmach_device_state(pm, ta.ta_obj, &state_out);
309  M0_ASSERT(rc == 0);
310  if (state_out == M0_PNDS_SNS_REPAIRED) {
311  M0_LOG(M0_DEBUG, "repaired index:%d", (int)ta.ta_obj);
312  goto out;
313  }
314  /*
315  * Failed spare unit may contain data of previously failed data
316  * unit from the parity group. Reverse map the spare unit to the
317  * repaired data/parity unit from the parity group.
318  * If we fail to map the spare unit to any of the previously
319  * failed data unit, means the spare is empty.
320  * We lock fctx to protect pdclust instance tile cache.
321  */
323  rc = m0_sns_repair_data_map(pm, pl, pi,
324  group_nr, spare_nr,
325  &data_unit_id_out);
327  if (rc == -ENOENT) {
328  M0_LOG(M0_DEBUG, "empty spare index:%d", (int)spare_nr);
329  goto out;
330  }
331  M0_SET0(&sa);
332  M0_SET0(&ta);
333 
334  sa.sa_unit = data_unit_id_out;
335  sa.sa_group = group_nr;
336 
337  /*
338  * The mechanism to reverse map the spare unit to any of the
339  * previously failed data unit is generic and based to device
340  * failure information from the pool machine.
341  * Thus if the device hosting the reverse mapped data unit for
342  * the given spare is in M0_PNDS_SNS_REPAIRED state, means the
343  * given spare unit contains data and needs to be repaired, else
344  * it is empty.
345  */
346  m0_sns_cm_unit2cobfid(fctx, &sa, &ta, &cobfid);
349  &state_out);
350  M0_ASSERT(rc == 0);
351  if (!M0_IN(state_out, (M0_PNDS_SNS_REPAIRED,
353  goto out;
354  }
355  }
356  result = false;
357 out:
358  return result;
359 }
360 
361 M0_INTERNAL
363  uint64_t fidx)
364 {
365  return m0_sns_cm_ag_nr_data_units(pl) +
366  m0_sns_cm_ag_nr_parity_units(pl) + fidx;
367 }
368 
369 M0_INTERNAL uint64_t m0_sns_cm_ag_unit_start(const struct m0_sns_cm *scm,
370  const struct m0_pdclust_layout *pl)
371 {
372  return scm->sc_helpers->sch_ag_unit_start(pl);
373 }
374 
375 M0_INTERNAL uint64_t m0_sns_cm_ag_unit_end(const struct m0_sns_cm *scm,
376  const struct m0_pdclust_layout *pl)
377 {
378  return scm->sc_helpers->sch_ag_unit_end(pl);
379 }
380 
382  uint64_t tgt_unit,
383  struct m0_fid *cobfid)
384 {
385  struct m0_pdclust_src_addr sa;
386  struct m0_pdclust_tgt_addr ta;
387  struct m0_sns_cm_file_ctx *fctx = sag->sag_fctx;
388 
391  sa.sa_unit = tgt_unit;
392  m0_sns_cm_unit2cobfid(fctx, &sa, &ta, cobfid);
393 
394  return 0;
395 }
396 
397 static const char *local_ep(const struct m0_cm *cm)
398 {
399  struct m0_reqh *rh = cm->cm_service.rs_reqh;
400  struct m0_rpc_machine *rm = m0_cm_rpc_machine_find(rh);
401 
402  return m0_rpc_machine_ep(rm);
403 }
404 
413 static struct m0_conf_service *
415  const struct m0_pool_version *pv,
416  const struct m0_fid *cob_fid)
417 {
419  uint32_t dev_idx;
420  struct m0_fid svc_fid;
421  struct m0_conf_service *svc = 0;
422  int rc;
423 
424  dev_idx = m0_fid_cob_device_id(cob_fid);
425  svc_fid = pv->pv_pc->pc_dev2svc[dev_idx].pds_ctx->sc_fid;
426  rc = m0_conf_service_get(confc, &svc_fid, &svc);
427  M0_ASSERT(rc == 0); /* Error checking is for sissies. */
428 
429  M0_POST(svc->cs_type == M0_CST_IOS);
430  M0_POST(svc->cs_endpoints[0] != NULL);
431  return svc;
432 }
433 
434 M0_INTERNAL const char *m0_sns_cm_tgt_ep(const struct m0_cm *cm,
435  const struct m0_pool_version *pv,
436  const struct m0_fid *cob_fid,
437  struct m0_conf_obj **hostage)
438 {
439  struct m0_conf_service *svc;
440 
441  *hostage = NULL; /* prevents m0_confc_close(<invalid_conf_obj>) in FI case */
442  if (M0_FI_ENABLED("local-ep"))
443  return local_ep(cm);
445  *hostage = &svc->cs_obj;
446  return svc->cs_endpoints[0];
447 }
448 
449 M0_INTERNAL bool m0_sns_cm_is_local_cob(const struct m0_cm *cm,
450  const struct m0_pool_version *pv,
451  const struct m0_fid *cob_fid)
452 {
453  struct m0_conf_obj *svc;
454  bool result;
455 
456  if (M0_FI_ENABLED("local-ep"))
457  return true;
458  result = m0_streq(m0_sns_cm_tgt_ep(cm, pv, cob_fid, &svc),
459  local_ep(cm));
461  return result;
462 }
463 
464 M0_INTERNAL size_t m0_sns_cm_ag_unrepaired_units(const struct m0_sns_cm *scm,
465  struct m0_sns_cm_file_ctx *fctx,
466  uint64_t group,
467  struct m0_bitmap *fmap_out)
468 {
469  struct m0_pdclust_src_addr sa;
470  struct m0_pdclust_tgt_addr ta;
471  struct m0_fid cobfid;
472  uint64_t upg;
473  uint64_t unit;
474  size_t group_failures = 0;
475  struct m0_pdclust_layout *pl;
476  struct m0_poolmach *pm;
477  M0_ENTRY();
478 
479  M0_PRE(scm != NULL && fctx != NULL);
480 
481  pm = fctx->sf_pm;
483  upg = m0_sns_cm_ag_size(pl);
484  sa.sa_group = group;
485  for (unit = 0; unit < upg; ++unit) {
486  if (m0_sns_cm_unit_is_spare(fctx, group, unit))
487  continue;
488  sa.sa_unit = unit;
489  m0_sns_cm_unit2cobfid(fctx, &sa, &ta, &cobfid);
490  if (scm->sc_helpers->sch_is_cob_failed(pm, ta.ta_obj) &&
492  M0_CNT_INC(group_failures);
493  if (fmap_out != NULL) {
494  M0_ASSERT(fmap_out->b_nr == upg);
495  m0_bitmap_set(fmap_out, unit, true);
496  }
497  }
498  }
499 
500  M0_LEAVE("number of failures in group = %lu are %u",
501  (unsigned long)group, (unsigned)group_failures);
502  return group_failures;
503 }
504 
505 M0_INTERNAL bool m0_sns_cm_ag_is_relevant(struct m0_sns_cm *scm,
506  struct m0_sns_cm_file_ctx *fctx,
507  const struct m0_cm_ag_id *id)
508 {
509  struct m0_fid fid;
510  size_t group_failures;
511  uint64_t group;
512  bool result = false;
513 
514  M0_ENTRY();
515 
516  agid2fid(id, &fid);
517  group = id->ai_lo.u_lo;
518  /* Firstly check if this group has any failed units. */
519  group_failures = m0_sns_cm_ag_unrepaired_units(scm, fctx, group, NULL);
520  if (group_failures > 0 )
522 
523  return M0_RC(result);
524 }
525 
526 M0_INTERNAL int m0_sns_cm_ag_in_cp_units(const struct m0_sns_cm *scm,
527  const struct m0_cm_ag_id *id,
528  struct m0_sns_cm_file_ctx *fctx,
529  uint32_t *in_cp_nr,
530  uint32_t *in_units_nr,
531  struct m0_cm_proxy_in_count *pcount)
532 {
534 
535  return scm->sc_helpers->sch_ag_in_cp_units(scm, id, fctx, in_cp_nr,
536  in_units_nr, pcount);
537 }
538 
539 M0_INTERNAL bool m0_sns_cm_fid_is_valid(const struct m0_sns_cm *snscm,
540  const struct m0_fid *fid)
541 {
542  return m0_fid_is_set(fid) && m0_fid_is_valid(fid) &&
543  m0_sns_cm2reqh(snscm)->rh_oostore ? true:
545 }
546 
547 M0_INTERNAL struct m0_reqh *m0_sns_cm2reqh(const struct m0_sns_cm *snscm)
548 {
549  return snscm->sc_base.cm_service.rs_reqh;
550 }
551 
552 M0_INTERNAL bool m0_sns_cm_disk_has_dirty_pver(struct m0_cm *cm,
553  struct m0_conf_drive *disk,
554  bool clear)
555 {
556  struct m0_conf_pver **conf_pvers;
557  struct m0_pool_version *pver;
559  uint32_t k;
560 
561  conf_pvers = disk->ck_pvers;
562  for (k = 0; conf_pvers[k] != NULL; ++k) {
563  pver = m0_pool_version_find(pc, &conf_pvers[k]->pv_obj.co_id);
565  M0_LOG(M0_FATAL, "pver %p is dirty, clearing", pver);
566  if (clear)
567  pver->pv_sns_flags = 0;
568  return true;
569  }
570  }
571 
572  return false;
573 }
574 
576 {
577  return pver->pv_sns_flags & PV_SNS_DIRTY;
578 }
579 
581 {
582  pver->pv_sns_flags |= PV_SNS_DIRTY;
583 }
584 
585 M0_INTERNAL int m0_sns_cm_pool_ha_nvec_alloc(struct m0_pool *pool,
586  enum m0_pool_nd_state state,
587  struct m0_ha_nvec *nvec)
588 {
589  struct m0_pooldev *pd;
590  struct m0_ha_note *note;
591  uint64_t nr_devs = 0;
592 
593  m0_tl_for(pool_failed_devs, &pool->po_failed_devices, pd) {
594  if (pd->pd_state == state)
595  M0_CNT_INC(nr_devs);
596  } m0_tl_endfor;
597  if (nr_devs == 0)
598  return M0_ERR(-ENOENT);
599  /* We add one more ha note for pool. */
600  M0_ALLOC_ARR(note, nr_devs + 1);
601  if (note == NULL)
602  return M0_ERR(-ENOMEM);
603  nvec->nv_nr = nr_devs + 1;
604  nvec->nv_note = note;
605 
606  return 0;
607 }
608 
609 M0_INTERNAL
611  uint32_t units_per_group, uint64_t group)
612 {
613  struct m0_pdclust_src_addr sa;
614  struct m0_pdclust_tgt_addr ta;
615  struct m0_fid cob_fid;
616  struct m0_sns_cm *scm;
617  uint32_t i;
618  int rc;
619 
620  scm = fctx->sf_scm;
621  sa.sa_group = group;
622  for (i = 0; i < units_per_group; ++i) {
623  sa.sa_unit = i;
624  m0_sns_cm_unit2cobfid(fctx, &sa, &ta, &cob_fid);
626  if (rc == 0)
627  return true;
628  }
629 
630  return false;
631 }
632 
633 M0_INTERNAL enum m0_sns_cm_local_unit_type
635  uint64_t unit)
636 {
637  struct m0_pdclust_src_addr sa;
638  struct m0_pdclust_tgt_addr ta;
639  struct m0_fid cob_fid;
640  struct m0_pool_version *pv;
641  struct m0_sns_cm *scm;
642  int rc;
643 
644  if (group > fctx->sf_max_group)
645  return M0_SNS_CM_UNIT_INVALID;
646  sa.sa_group = group;
647  sa.sa_unit = unit;
648  scm = fctx->sf_scm;
649  pv = fctx->sf_pm->pm_pver;
650  m0_sns_cm_unit2cobfid(fctx, &sa, &ta, &cob_fid);
652  if (rc == -ENOENT) {
655  }
656 
658 }
659 
660 #undef M0_TRACE_SUBSYSTEM
661 
664 /*
665  * Local variables:
666  * c-indentation-style: "K&R"
667  * c-basic-offset: 8
668  * tab-width: 8
669  * fill-column: 80
670  * scroll-step: 1
671  * End:
672  */
uint64_t(* sch_ag_unit_start)(const struct m0_pdclust_layout *pl)
Definition: cm.h:164
M0_INTERNAL uint64_t m0_sns_cm_ag_nr_global_units(const struct m0_sns_cm_ag *sag, struct m0_pdclust_layout *pl)
Definition: cm_utils.c:215
M0_INTERNAL struct m0_layout * m0_layout_find(struct m0_layout_domain *dom, uint64_t lid)
Definition: layout.c:861
M0_INTERNAL void m0_sns_cm_pver_dirty_set(struct m0_pool_version *pver)
Definition: cm_utils.c:580
M0_INTERNAL uint64_t m0_sns_cm_ag_nr_data_units(const struct m0_pdclust_layout *pl)
Definition: cm_utils.c:222
M0_INTERNAL bool m0_sns_cm_ag_is_relevant(struct m0_sns_cm *scm, struct m0_sns_cm_file_ctx *fctx, const struct m0_cm_ag_id *id)
Definition: cm_utils.c:505
Definition: cm.h:205
static struct m0_addb2_philter p
Definition: consumer.c:40
#define M0_PRE(cond)
M0_INTERNAL void m0_sns_cm_unit2cobfid(struct m0_sns_cm_file_ctx *fctx, const struct m0_pdclust_src_addr *sa, struct m0_pdclust_tgt_addr *ta, struct m0_fid *cfid_out)
Definition: cm_utils.c:117
#define M0_ALLOC_ARR(arr, nr)
Definition: memory.h:84
Definition: cob.h:581
M0_INTERNAL bool m0_sns_cm_pver_is_dirty(struct m0_pool_version *pver)
Definition: cm_utils.c:575
M0_INTERNAL bool m0_sns_cm_fid_is_valid(const struct m0_sns_cm *snscm, const struct m0_fid *fid)
Definition: cm_utils.c:539
M0_INTERNAL struct m0_rpc_machine * m0_cm_rpc_machine_find(struct m0_reqh *reqh)
Definition: cm.c:712
struct m0_fid sc_fid
Definition: reqh_service.h:751
uint64_t sa_group
Definition: pdclust.h:241
M0_INTERNAL void agid2fid(const struct m0_cm_ag_id *id, struct m0_fid *fid)
Definition: ag.c:405
M0_INTERNAL uint64_t m0_fid_hash(const struct m0_fid *fid)
Definition: fid.c:295
#define NULL
Definition: misc.h:38
uint64_t pa_unit_size
Definition: pdclust.h:118
M0_INTERNAL const char * m0_sns_cm_tgt_ep(const struct m0_cm *cm, const struct m0_pool_version *pv, const struct m0_fid *cob_fid, struct m0_conf_obj **hostage)
Definition: cm_utils.c:434
M0_INTERNAL uint64_t m0_sns_cm_ag_unit_start(const struct m0_sns_cm *scm, const struct m0_pdclust_layout *pl)
Definition: cm_utils.c:369
struct m0_pool_version * pm_pver
Definition: pool_machine.h:172
M0_INTERNAL struct m0_pool_version * m0_pool_version_find(struct m0_pools_common *pc, const struct m0_fid *id)
Definition: pool.c:586
uint32_t pa_N
Definition: pdclust.h:104
struct m0_pool_version * pv
Definition: dir.c:629
#define M0_LOG(level,...)
Definition: trace.h:167
M0_LEAVE()
M0_INTERNAL void m0_sns_cm_file_fwd_map(struct m0_sns_cm_file_ctx *fctx, const struct m0_pdclust_src_addr *sa, struct m0_pdclust_tgt_addr *ta)
Definition: file.c:750
M0_INTERNAL bool m0_sns_cm_is_local_cob(const struct m0_cm *cm, const struct m0_pool_version *pv, const struct m0_fid *cob_fid)
Definition: cm_utils.c:449
M0_INTERNAL void m0_uint128_init(struct m0_uint128 *u128, const char *magic)
Definition: misc.c:150
uint32_t pa_K
Definition: pdclust.h:107
M0_INTERNAL int m0_linear_enum_build(struct m0_layout_domain *dom, const struct m0_layout_linear_attr *attr, struct m0_layout_linear_enum **out)
Definition: linear_enum.c:138
uint64_t sf_max_group
Definition: file.h:67
M0_INTERNAL void m0_layout_enum_fini(struct m0_layout_enum *le)
Definition: layout.c:518
struct m0_layout * sf_layout
Definition: file.h:74
uint64_t ta_obj
Definition: pdclust.h:256
struct m0_cm_ag_id cag_id
Definition: ag.h:72
M0_INTERNAL void m0_sns_cm_fctx_unlock(struct m0_sns_cm_file_ctx *fctx)
Definition: file.c:58
M0_INTERNAL void m0_cob_put(struct m0_cob *cob)
Definition: cob.c:1095
static struct m0_sns_cm * scm
Definition: cm.c:64
uint32_t pa_S
Definition: pdclust.h:110
M0_INTERNAL uint64_t m0_sns_cm_ag_nr_parity_units(const struct m0_pdclust_layout *pl)
Definition: cm_utils.c:228
struct m0_fid sf_fid
Definition: file.h:63
M0_INTERNAL int m0_poolmach_device_state(struct m0_poolmach *pm, uint32_t device_index, enum m0_pool_nd_state *state_out)
Definition: pool_machine.c:816
#define M0_SET0(obj)
Definition: misc.h:64
M0_INTERNAL int m0_sns_cm_ag_tgt_unit2cob(struct m0_sns_cm_ag *sag, uint64_t tgt_unit, struct m0_fid *cobfid)
Definition: cm_utils.c:381
struct m0_poolmach * sf_pm
Definition: file.h:70
struct m0_conf_pver ** ck_pvers
Definition: obj.h:715
M0_INTERNAL const char * m0_rpc_machine_ep(const struct m0_rpc_machine *rmach)
Definition: rpc_machine.c:603
M0_INTERNAL bool m0_fid_is_set(const struct m0_fid *fid)
Definition: fid.c:106
M0_INTERNAL uint64_t m0_sns_cm_ag_unit2cobindex(struct m0_sns_cm_ag *sag, uint64_t unit)
Definition: cm_utils.c:143
static struct m0_cob_domain * cdom
Definition: xform.c:55
M0_INTERNAL uint64_t m0_sns_cm_ag_unit_end(const struct m0_sns_cm *scm, const struct m0_pdclust_layout *pl)
Definition: cm_utils.c:375
static struct m0_pools_common pc
Definition: iter_ut.c:59
#define m0_tl_endfor
Definition: tlist.h:700
struct m0_fid fid
Definition: di.c:46
return M0_RC(rc)
static struct m0_cm * cm
Definition: cm.c:63
int(* sch_ag_in_cp_units)(const struct m0_sns_cm *scm, const struct m0_cm_ag_id *id, struct m0_sns_cm_file_ctx *fctx, uint32_t *in_cp_nr, uint32_t *in_units_nr, struct m0_cm_proxy_in_count *pcount)
Definition: cm.h:153
M0_INTERNAL uint64_t agid2group(const struct m0_cm_ag_id *id)
Definition: ag.c:413
#define M0_ENTRY(...)
Definition: trace.h:170
static struct m0_sns_cm_ag * sag
Definition: cm.c:66
M0_INTERNAL bool m0_sns_cm_is_cob_repairing(struct m0_poolmach *pm, uint32_t cob_index)
Definition: cm_utils.c:256
int i
Definition: dir.c:1033
M0_INTERNAL bool m0_sns_cm_is_cob_rebalancing(struct m0_poolmach *pm, uint32_t cob_index)
Definition: cm_utils.c:266
int32_t nv_nr
Definition: note.h:196
return M0_ERR(-EOPNOTSUPP)
struct m0_layout_enum lle_base
Definition: linear_enum.h:69
M0_INTERNAL uint32_t m0_sns_cm_device_index_get(uint64_t group, uint64_t unit_number, struct m0_sns_cm_file_ctx *fctx)
Definition: cm_utils.c:126
struct m0_sns_cm * sf_scm
Definition: file.h:94
M0_INTERNAL struct m0_confc * m0_reqh2confc(struct m0_reqh *reqh)
Definition: reqh.c:753
M0_INTERNAL size_t m0_sns_cm_ag_unrepaired_units(const struct m0_sns_cm *scm, struct m0_sns_cm_file_ctx *fctx, uint64_t group, struct m0_bitmap *fmap_out)
Definition: cm_utils.c:464
static struct m0_cob * cob
Definition: bytecount.c:40
#define M0_ASSERT(cond)
M0_INTERNAL uint32_t m0_pdclust_N(const struct m0_pdclust_layout *pl)
Definition: pdclust.c:352
static struct m0_confc * confc
Definition: file.c:94
struct m0_fid pver
Definition: idx_dix.c:74
m0_pool_nd_state
Definition: pool_machine.h:57
M0_INTERNAL int m0_sns_cm_cob_locate(struct m0_cob_domain *cdom, const struct m0_fid *cob_fid)
Definition: cm_utils.c:157
uint64_t ta_frame
Definition: pdclust.h:254
M0_INTERNAL void m0_cob_oikey_make(struct m0_cob_oikey *oikey, const struct m0_fid *fid, int linkno)
Definition: cob.c:141
M0_INTERNAL uint64_t m0_sns_cm_ag_nr_local_units(struct m0_sns_cm *scm, struct m0_sns_cm_file_ctx *fctx, uint64_t group)
Definition: cm_utils.c:176
m0_sns_cm_local_unit_type
Definition: cm.h:128
#define m0_streq(a, b)
Definition: string.h:34
M0_INTERNAL uint32_t m0_pdclust_S(const struct m0_pdclust_layout *pl)
Definition: pdclust.c:362
static struct m0_fid cob_fid
Definition: net.c:116
M0_INTERNAL struct m0_pdclust_layout * m0_layout_to_pdl(const struct m0_layout *l)
Definition: pdclust.c:382
bool rh_oostore
Definition: reqh.h:171
M0_INTERNAL uint32_t m0_fid_cob_device_id(const struct m0_fid *cob_fid)
Definition: fid_convert.c:81
bool(* sch_ag_is_relevant)(struct m0_sns_cm *scm, struct m0_sns_cm_file_ctx *fctx, uint64_t group)
Definition: cm.h:176
struct m0_pdclust_instance pi
Definition: fd.c:107
M0_INTERNAL uint32_t m0_pdclust_K(const struct m0_pdclust_layout *pl)
Definition: pdclust.c:357
M0_INTERNAL bool m0_sns_cm_is_cob_repaired(struct m0_poolmach *pm, uint32_t cob_index)
Definition: cm_utils.c:246
#define M0_POST(cond)
M0_INTERNAL bool m0_poolmach_device_is_in_spare_usage_array(struct m0_poolmach *pm, uint32_t device_index)
Definition: pool_machine.c:867
struct m0_pools_common * pv_pc
Definition: pool.h:130
M0_INTERNAL uint64_t m0_sns_cm_ag_spare_unit_nr(const struct m0_pdclust_layout *pl, uint64_t fidx)
Definition: cm_utils.c:362
Definition: reqh.h:94
M0_INTERNAL void m0_bitmap_set(struct m0_bitmap *map, size_t idx, bool val)
Definition: bitmap.c:139
struct m0_layout_domain rh_ldom
Definition: reqh.h:153
M0_INTERNAL int m0_sns_repair_data_map(struct m0_poolmach *pm, struct m0_pdclust_layout *pl, struct m0_pdclust_instance *pi, uint64_t group_number, uint64_t spare_unit_number, uint64_t *data_unit_id_out)
uint64_t(* sch_ag_unit_end)(const struct m0_pdclust_layout *pl)
Definition: cm.h:170
static void group(void)
Definition: sm.c:386
M0_INTERNAL void m0_sns_cm_fctx_lock(struct m0_sns_cm_file_ctx *fctx)
Definition: file.c:53
struct m0_pool_device_to_service * pc_dev2svc
Definition: pool.h:207
M0_INTERNAL int m0_sns_cm_ag_in_cp_units(const struct m0_sns_cm *scm, const struct m0_cm_ag_id *id, struct m0_sns_cm_file_ctx *fctx, uint32_t *in_cp_nr, uint32_t *in_units_nr, struct m0_cm_proxy_in_count *pcount)
Definition: cm_utils.c:526
struct m0_cob_domain * sc_cob_dom
Definition: cm.h:217
#define FID_P(f)
Definition: fid.h:77
#define PRId64
Definition: types.h:57
M0_INTERNAL uint64_t m0_sns_cm_ag_nr_spare_units(const struct m0_pdclust_layout *pl)
Definition: cm_utils.c:234
M0_INTERNAL struct m0_reqh * m0_sns_cm2reqh(const struct m0_sns_cm *snscm)
Definition: cm_utils.c:547
struct m0_uint128 pa_seed
Definition: pdclust.h:121
static struct m0_pool pool
Definition: iter_ut.c:58
M0_INTERNAL struct m0_layout * m0_pdl_to_layout(struct m0_pdclust_layout *pl)
Definition: pdclust.c:393
M0_INTERNAL enum m0_sns_cm_local_unit_type m0_sns_cm_local_unit_type_get(struct m0_sns_cm_file_ctx *fctx, uint64_t group, uint64_t unit)
Definition: cm_utils.c:634
struct m0_reqh_service_ctx * pds_ctx
Definition: pool.h:74
M0_INTERNAL bool m0_fid_eq(const struct m0_fid *fid0, const struct m0_fid *fid1)
Definition: fid.c:164
uint64_t sa_unit
Definition: pdclust.h:243
static struct m0_conf_service * cm_conf_service_get(const struct m0_cm *cm, const struct m0_pool_version *pv, const struct m0_fid *cob_fid)
Definition: cm_utils.c:414
struct m0_sns_cm_file_ctx * sag_fctx
Definition: ag.h:48
M0_INTERNAL bool m0_sns_cm_group_has_local_presence(struct m0_sns_cm_file_ctx *fctx, uint32_t units_per_group, uint64_t group)
Definition: cm_utils.c:610
struct m0_reqh reqh
Definition: rm_foms.c:48
#define M0_CNT_INC(cnt)
Definition: arith.h:226
#define M0_FI_ENABLED(tag)
Definition: finject.h:231
Definition: fid.h:38
M0_INTERNAL const struct m0_fid M0_MDSERVICE_START_FID
Definition: md_fid.c:68
uint64_t f_key
Definition: fid.h:40
M0_INTERNAL uint64_t m0_sns_cm_ag_size(const struct m0_pdclust_layout *pl)
Definition: cm_utils.c:239
M0_INTERNAL int m0_sns_cm_pool_ha_nvec_alloc(struct m0_pool *pool, enum m0_pool_nd_state state, struct m0_ha_nvec *nvec)
Definition: cm_utils.c:585
static const char * local_ep(const struct m0_cm *cm)
Definition: cm_utils.c:397
struct m0_reqh_service cm_service
Definition: cm.h:191
uint32_t pa_P
Definition: pdclust.h:115
static struct m0_net_test_service svc
Definition: service.c:34
Definition: cm.h:166
struct m0_tl pc_pools
Definition: pool.h:162
M0_INTERNAL enum m0_pdclust_unit_type m0_pdclust_unit_classify(const struct m0_pdclust_layout *pl, int unit)
Definition: pdclust.c:425
static int start(struct m0_fom *fom)
Definition: trigger_fom.c:321
struct m0_pools_common * rh_pools
Definition: reqh.h:118
M0_INTERNAL int m0_pdclust_build(struct m0_layout_domain *dom, uint64_t lid, const struct m0_pdclust_attr *attr, struct m0_layout_enum *le, struct m0_pdclust_layout **out)
Definition: pdclust.c:305
M0_INTERNAL bool m0_sns_cm_unit_is_spare(struct m0_sns_cm_file_ctx *fctx, uint64_t group_nr, uint64_t spare_nr)
Definition: cm_utils.c:277
M0_INTERNAL int m0_cob_locate(struct m0_cob_domain *dom, struct m0_cob_oikey *oikey, uint64_t flags, struct m0_cob **out)
Definition: cob.c:1407
M0_INTERNAL void m0_confc_close(struct m0_conf_obj *obj)
Definition: confc.c:921
struct m0_cm sc_base
Definition: cm.h:206
struct m0_cob_attr sf_attr
Definition: file.h:65
struct m0_pdclust_instance * sf_pi
Definition: file.h:77
static struct m0_sns_cm_file_ctx fctx
Definition: net.c:55
Definition: pool.h:80
#define out(...)
Definition: gen.c:41
struct m0_cm_aggr_group sag_base
Definition: ag.h:46
size_t b_nr
Definition: bitmap.h:44
struct m0_ha_note * nv_note
Definition: note.h:197
M0_INTERNAL const struct m0_fid * m0_cob_fid(const struct m0_cob *cob)
Definition: cob.c:122
M0_INTERNAL bool m0_fid_is_valid(const struct m0_fid *fid)
Definition: fid.c:96
M0_INTERNAL bool m0_cm_is_locked(const struct m0_cm *cm)
Definition: cm.c:560
struct m0_reqh * rs_reqh
Definition: reqh_service.h:259
#define m0_tl_for(name, head, obj)
Definition: tlist.h:695
bool(* sch_is_cob_failed)(struct m0_poolmach *pm, uint32_t cob_index)
Definition: cm.h:188
const struct m0_sns_cm_helpers * sc_helpers
Definition: cm.h:215
M0_INTERNAL int m0_sns_cm_ut_file_size_layout(struct m0_sns_cm_file_ctx *fctx)
Definition: cm_utils.c:68
int32_t rc
Definition: trigger_fop.h:47
M0_INTERNAL bool m0_sns_cm_disk_has_dirty_pver(struct m0_cm *cm, struct m0_conf_drive *disk, bool clear)
Definition: cm_utils.c:552
M0_INTERNAL void m0_poolmach_gob2cob(struct m0_poolmach *pm, const struct m0_fid *gfid, uint32_t idx, struct m0_fid *cob_fid)
Definition: ag.h:49
M0_INTERNAL uint64_t m0_pdclust_unit_size(const struct m0_pdclust_layout *pl)
Definition: pdclust.c:377
#define FID_F
Definition: fid.h:75
M0_INTERNAL uint64_t m0_hash(uint64_t x)
Definition: hash.c:279
uint64_t ca_size
Definition: cob.h:376
struct m0_tl po_failed_devices
Definition: pool.h:93