Motr  M0
cm.c
Go to the documentation of this file.
1 /* -*- C -*- */
2 /*
3  * Copyright (c) 2013-2020 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 #include <sys/stat.h>
24 
25 #include "lib/misc.h"
26 #include "lib/memory.h"
27 #include "lib/finject.h"
28 #include "lib/locality.h"
29 
30 #include "net/buffer_pool.h"
31 #include "net/lnet/lnet.h"
32 #include "reqh/reqh_service.h"
33 #include "reqh/reqh.h"
34 #include "motr/setup.h"
35 #include "cob/cob.h"
36 #include "mdstore/mdstore.h" /* m0_cob_alloc(), m0_cob_nskey_make(),
37  m0_cob_fabrec_make(), m0_cob_create */
38 #include "fop/fom.h" /* M0_FSO_AGAIN, M0_FSO_WAIT */
39 #include "fop/fom_simple.h"
40 #include "ioservice/io_service.h"
41 #include "ioservice/fid_convert.h" /* m0_fid_convert_gob2cob */
42 #include "pool/pool.h"
43 #include "mdservice/md_fid.h"
44 #include "rm/rm_service.h" /* m0_rms_type */
45 #include "sns/cm/repair/ag.h"
46 #include "sns/cm/cm.h"
47 #include "sns/cm/file.h"
49 
50 enum {
51  ITER_UT_BUF_NR = 1 << 8,
53 };
54 
55 enum {
59 };
60 
61 static struct m0_reqh *reqh;
62 static struct m0_reqh_service *service;
63 static struct m0_cm *cm;
64 static struct m0_sns_cm *scm;
65 static struct m0_sns_cm_cp scp;
66 static struct m0_sns_cm_ag *sag;
67 static struct m0_fom_simple iter_fom;
69 static struct m0_semaphore iter_sem;
70 static const struct m0_fid M0_SNS_CM_REPAIR_UT_PVER = M0_FID_TINIT('v', 1, 8);
71 
73  [M0_FOM_PHASE_INIT] = {
74  .sd_name = "init",
75  .sd_allowed = M0_BITS(ITER_RUN),
76  .sd_flags = M0_SDF_INITIAL
77  },
78  [ITER_RUN] = {
79  .sd_name = "Iterator run",
80  .sd_allowed = M0_BITS(ITER_WAIT, M0_FOM_PHASE_INIT,
82  },
83  [ITER_WAIT] = {
84  .sd_name = "Iterator wait",
85  .sd_allowed = M0_BITS(ITER_RUN, M0_FOM_PHASE_INIT,
87  },
88  [ITER_COMPLETE] = {
89  .sd_name = "Iterator complete",
91  },
93  .sd_name = "fini",
94  .sd_flags = M0_SDF_TERMINAL
95  }
96 };
97 
98 static struct m0_sm_conf iter_ut_conf = {
99  .scf_name = "iter ut fom",
100  .scf_nr_states = ARRAY_SIZE(iter_ut_fom_phases),
101  .scf_state = iter_ut_fom_phases,
102 };
103 
104 static void service_start_success(void)
105 {
106  int rc;
107 
108  rc = cs_init(&sctx);
109  M0_ASSERT(rc == 0);
110  cs_fini(&sctx);
111 }
112 
113 static void service_init_failure(void)
114 {
115  int rc;
116 
117  m0_fi_enable_once("m0_cm_init", "init_failure");
118  rc = cs_init(&sctx);
119  M0_ASSERT(rc != 0);
120 }
121 
122 static void service_start_failure(void)
123 {
124  int rc;
125 
126  m0_fi_enable_once("m0_cm_setup", "setup_failure");
127  rc = cs_init(&sctx);
128  M0_ASSERT(rc != 0);
129 }
130 
131 static void iter_setup(enum m0_cm_op op, uint64_t fd)
132 {
133  struct m0_motr *motr;
134  struct m0_pool_version *pver;
135  int rc;
136 
137  rc = cs_init(&sctx);
138  M0_ASSERT(rc == 0);
139 
142  m0_reqh_service_type_find("M0_CST_SNS_REP"), reqh);
144 
145  cm = container_of(service, struct m0_cm, cm_service);
146  scm = cm2sns(cm);
147  scm->sc_op = op;
150  M0_UT_ASSERT(pver != NULL);
153  rc = cm->cm_ops->cmo_prepare(cm);
154  M0_UT_ASSERT(rc == 0);
155  m0_cm_lock(cm);
158  rc = cm->cm_ops->cmo_start(cm);
159  M0_UT_ASSERT(rc == 0);
161  M0_UT_ASSERT(rc == 0);
163  m0_cm_unlock(cm);
165  M0_ASSERT(service != NULL);
166 }
167 
168 static bool cp_verify(struct m0_sns_cm_cp *scp)
169 {
170  return m0_fid_is_valid(&scp->sc_stob_id.si_fid) &&
172  scp->sc_base.c_ag != NULL &&
173  !cp_data_buf_tlist_is_empty(&scp->sc_base.c_buffers);
174 }
175 
176 M0_INTERNAL void cob_create(struct m0_reqh *reqh, struct m0_cob_domain *cdom,
177  struct m0_be_domain *bedom,
178  uint64_t cont, struct m0_fid *gfid,
179  uint32_t cob_idx)
180 {
181  struct m0_sm_group *grp = m0_locality0_get()->lo_grp;
182  struct m0_cob *cob;
183  struct m0_motr *motr;
184  struct m0_pool_version *pver;
185  struct m0_fid cob_fid;
186  struct m0_dtx tx = {};
187  struct m0_cob_nskey *nskey;
188  struct m0_cob_nsrec nsrec;
189  struct m0_cob_fabrec *fabrec;
190  struct m0_cob_omgrec omgrec;
191  char nskey_bs[UINT32_STR_LEN];
192  uint32_t nskey_bs_len;
193  int rc;
194 
195  M0_SET0(&nsrec);
196  M0_SET0(&omgrec);
197  rc = m0_cob_alloc(cdom, &cob);
198  M0_ASSERT(rc == 0 && cob != NULL);
200 
201  M0_SET_ARR0(nskey_bs);
202  snprintf(nskey_bs, UINT32_STR_LEN, "%u", cob_idx);
203  nskey_bs_len = strlen(nskey_bs);
204 
207  M0_UT_ASSERT(pver != NULL);
208  rc = m0_cob_nskey_make(&nskey, gfid, nskey_bs, nskey_bs_len);
209  M0_ASSERT(rc == 0 && nskey != NULL);
210  m0_cob_nsrec_init(&nsrec);
211  nsrec.cnr_fid = cob_fid;
212  nsrec.cnr_nlink = 1;
213  nsrec.cnr_pver = pver->pv_id;
214  nsrec.cnr_lid = 1;
215 
216  rc = m0_cob_fabrec_make(&fabrec, NULL, 0);
217  M0_ASSERT(rc == 0 && fabrec != NULL);
219  m0_dtx_init(&tx, bedom, grp);
221  rc = m0_dtx_open_sync(&tx);
222  M0_ASSERT(rc == 0);
223  rc = m0_cob_create(cob, nskey, &nsrec, fabrec, &omgrec, &tx.tx_betx);
224  M0_ASSERT(rc == 0);
225  m0_dtx_done_sync(&tx);
226  m0_dtx_fini(&tx);
228  m0_cob_put(cob);
229 }
230 
231 M0_INTERNAL void cob_delete(struct m0_cob_domain *cdom,
232  struct m0_be_domain *bedom,
233  uint64_t cont, const struct m0_fid *gfid)
234 {
235  struct m0_sm_group *grp = m0_locality0_get()->lo_grp;
236  struct m0_cob *cob;
237  struct m0_fid cob_fid;
238  struct m0_dtx tx = {};
239  struct m0_cob_oikey oikey;
240  int rc;
241 
243  m0_cob_oikey_make(&oikey, &cob_fid, 0);
244  rc = m0_cob_locate(cdom, &oikey, M0_CA_NSKEY_FREE, &cob);
245  M0_UT_ASSERT(rc == 0);
246 
248  m0_dtx_init(&tx, bedom, grp);
250  rc = m0_dtx_open_sync(&tx);
251  M0_ASSERT(rc == 0);
253  M0_UT_ASSERT(rc == 0);
254  m0_dtx_done_sync(&tx);
255  m0_dtx_fini(&tx);
257 }
258 
259 static void buf_put(struct m0_sns_cm_cp *scp)
260 {
262 }
263 
264 static void repair_ag_destroy(const struct m0_tl_descr *descr, struct m0_tl *head)
265 {
266  struct m0_sns_cm_repair_ag *rag;
267  struct m0_cm_aggr_group *ag;
268  struct m0_cm_cp *cp;
269  int i;
270 
271  m0_tlist_for(descr, head, ag) {
272  rag = sag2repairag(ag2snsag(ag));
273  for (i = 0; i < rag->rag_base.sag_fnr; ++i) {
274  cp = &rag->rag_fc[i].fc_tgt_acc_cp.sc_base;
275  if (rag->rag_fc[i].fc_is_inuse)
277  m0_cm_cp_only_fini(cp);
278  cp->c_ops->co_free(cp);
279  }
280  ag->cag_ops->cago_fini(ag);
281  } m0_tlist_endfor;
282 }
283 
284 static void ag_destroy(void)
285 {
286  if (cm->cm_aggr_grps_in_nr == 0 && cm->cm_aggr_grps_out_nr == 0)
288  repair_ag_destroy(&aggr_grps_in_tl, &cm->cm_aggr_grps_in);
289  repair_ag_destroy(&aggr_grps_out_tl, &cm->cm_aggr_grps_out);
290 }
291 
292 static void cobs_create(uint64_t nr_files, uint64_t nr_cobs)
293 {
294  struct m0_cob_domain *cdom;
295  struct m0_fid gfid;
296  uint32_t cob_idx;
297  int i;
298  int j;
299 
301  for (i = 0; i < nr_files; ++i) {
303  cob_idx = 0;
304  for (j = 1; j <= nr_cobs; ++j) {
306  j, &gfid, cob_idx);
307  cob_idx++;
308  }
309  }
310 }
311 
312 static void cobs_delete(uint64_t nr_files, uint64_t nr_cobs)
313 {
314  struct m0_cob_domain *cdom;
315  struct m0_fid gfid;
316  int i;
317  int j;
318 
320  for (i = 0; i < nr_files; ++i) {
322  for (j = 1; j <= nr_cobs; ++j)
324  }
325 }
326 
327 static int iter_ut_fom_tick(struct m0_fom *fom, uint32_t *sem_id, int *phase)
328 {
329  int rc = M0_FSO_AGAIN;
330 
331  switch (*phase) {
332  case M0_FOM_PHASE_INIT:
333  M0_SET0(&scp);
336  scm->sc_it.si_cp = &scp;
337  *phase = ITER_RUN;
338  rc = M0_FSO_AGAIN;
339  break;
340  case ITER_RUN:
341  m0_cm_lock(cm);
343  if (rc == M0_FSO_AGAIN) {
346  M0_ASSERT(sag->sag_fctx != NULL);
349  buf_put(&scp);
351  *phase = M0_FOM_PHASE_INIT;
352  }
353  if (rc == M0_FSO_WAIT || rc == -ENOBUFS) {
354  *phase = ITER_WAIT;
355  rc = M0_FSO_WAIT;
356  }
357  if (rc < 0) {
358  ag_destroy();
359  *phase = ITER_COMPLETE;
360  rc = M0_FSO_AGAIN;
361  }
362  m0_cm_unlock(cm);
363  break;
364  case ITER_WAIT:
365  *phase = ITER_RUN;
366  rc = M0_FSO_AGAIN;
367  break;
368  case ITER_COMPLETE:
369  /* Allow asts to run if any. */
370  m0_cm_lock(cm);
371  m0_cm_unlock(cm);
372  if (scm->sc_rm_ctx.rc_rt.rt_nr_resources == 0) {
373  *phase = M0_FOM_PHASE_FINISH;
375  } else {
377  m0_time_from_now(2, 0));
378  }
379  rc = M0_FSO_WAIT;
380  break;
381  }
382 
383  return rc;
384 }
385 
386 static void iter_run(uint64_t pool_width, uint64_t nr_files, uint64_t fd)
387 {
388  struct m0_pool_version *pver;
389  struct m0_motr *motr;
390 
391  m0_fi_enable("m0_sns_cm_file_attr_and_layout", "ut_attr_layout");
392  m0_fi_enable("iter_fid_attr_fetch", "ut_attr_fetch");
393  m0_fi_enable("iter_fid_attr_fetch_wait", "ut_attr_fetch_wait");
394  m0_fi_enable("iter_fid_layout_fetch", "ut_layout_fsize_fetch");
395  m0_fi_enable("iter_fid_next", "ut_fid_next");
396 
397  cobs_create(nr_files, pool_width);
400  M0_SET0(&iter_fom);
403  M0_UT_ASSERT(pver != NULL);
404  //pool_mach_transit(&pver->pv_mach, fd, M0_PNDS_FAILED);
405  //pool_mach_transit(&pver->pv_mach, fd, M0_PNDS_SNS_REPAIRING);
408  &iter_ut_fom_tick, NULL, NULL, 2);
413 
414  m0_fi_disable("m0_sns_cm_file_attr_and_layout", "ut_attr_layout");
415  m0_fi_disable("iter_fid_attr_fetch", "ut_attr_fetch");
416  m0_fi_disable("iter_fid_attr_fetch_wait", "ut_attr_fetch_wait");
417  m0_fi_disable("iter_fid_layout_fetch", "ut_layout_fsize_fetch");
418  m0_fi_disable("iter_fid_next", "ut_fid_next");
419 }
420 
421 static void _cpp_tx_start(struct m0_cm *cm)
422 {
423  int rc;
424  struct m0_be_tx_credit cred = {};
425  struct m0_be_tx *tx = &cm->cm_cp_pump.p_fom.fo_tx.tx_betx;
426  struct m0_sm_group *grp = m0_locality0_get()->lo_grp;
427 
430  NULL, NULL, NULL, NULL);
431  m0_be_tx_prep(tx, &cred);
432  rc = m0_be_tx_open_sync(tx);
433  M0_ASSERT(rc == 0);
434 }
435 
436 static void _cpp_tx_close(struct m0_cm *cm)
437 {
438  struct m0_sm_group *grp = m0_locality0_get()->lo_grp;
439  struct m0_be_tx *tx = &cm->cm_cp_pump.p_fom.fo_tx.tx_betx;
440 
442  m0_be_tx_fini(tx);
444 }
445 
446 static void iter_stop(uint64_t pool_width, uint64_t nr_files, uint64_t fd)
447 {
448  struct m0_pool_version *pver;
449  struct m0_motr *motr;
450 
451  _cpp_tx_start(cm);
452  m0_cm_stop(cm);
453  _cpp_tx_close(cm);
454 
455  cobs_delete(nr_files, pool_width);
458  M0_UT_ASSERT(pver != NULL);
459  /* Transition the failed device M0_PNDS_SNS_REBALANCING->M0_PNDS_ONLINE,
460  * for subsequent failure tests so that pool machine doesn't interpret
461  * it as a multiple failure after reading from the persistence store.
462  */
465  cs_fini(&sctx);
466 }
467 
468 static void iter_repair_single_file(void)
469 {
471  iter_run(6, 1, 2);
472  iter_stop(6, 1, 2);
473 }
474 
475 static void iter_repair_multi_file(void)
476 {
478  iter_run(6, 2, 4);
479  iter_stop(6, 2, 4);
480 }
481 
483 {
485  iter_run(6, 1, 1);
486  iter_stop(6, 1, 1);
487 }
488 
489 /*
490 static void iter_rebalance_single_file(void)
491 {
492  int rc;
493 
494  iter_setup(SNS_REBALANCE, 2);
495  rc = iter_run(10, 1);
496  M0_UT_ASSERT(rc == -ENODATA);
497  iter_stop(1, 5);
498 }
499 
500 static void iter_rebalance_multi_file(void)
501 {
502  int rc;
503 
504  iter_setup(SNS_REBALANCE, 5);
505  rc = iter_run(10, 2);
506  M0_UT_ASSERT(rc == -ENODATA);
507  iter_stop(2, 10);
508 }
509 
510 static void iter_rebalance_large_file_with_large_unit_size(void)
511 {
512  int rc;
513 
514  iter_setup(SNS_REBALANCE, 9);
515  rc = iter_run(10, 1);
516  M0_UT_ASSERT(rc == -ENODATA);
517  iter_stop(1, 10);
518 }
519 */
520 
521 static void iter_ag_init_failure(void)
522 {
523  m0_fi_enable_once("m0_sns_cm_ag_init", "ag_init_failure");
525  iter_run(6, 1, 2);
526  iter_stop(6, 1, 2);
527 }
528 
529 static void iter_invalid_nr_cobs(void)
530 {
532  iter_run(3, 1, 3);
533  iter_stop(3, 1, 3);
534 }
535 
537  .ts_name = "sns-cm-repair-ut",
538  .ts_init = NULL,
539  .ts_fini = NULL,
540  .ts_tests = {
541  { "service-startstop", service_start_success},
542  { "service-init-fail", service_init_failure},
543  { "service-start-fail", service_start_failure},
544  { "iter-repair-single-file", iter_repair_single_file},
545  { "iter-repair-multi-file", iter_repair_multi_file},
546  { "iter-repair-large-file-with-large-unit-size",
548  { "iter-ag-init-failure", iter_ag_init_failure},
549  { "iter-invalid-nr-cobs", iter_invalid_nr_cobs},
550  { NULL, NULL }
551  }
552 };
553 
554 /*
555  * Local variables:
556  * c-indentation-style: "K&R"
557  * c-basic-offset: 8
558  * tab-width: 8
559  * fill-column: 80
560  * scroll-step: 1
561  * End:
562  */
void cs_fini(struct m0_motr *sctx)
Definition: cp_common.c:221
uint64_t cm_aggr_grps_in_nr
Definition: cm.h:205
static void iter_invalid_nr_cobs(void)
Definition: cm.c:529
M0_INTERNAL void m0_cm_cp_buf_release(struct m0_cm_cp *cp)
Definition: cp.c:713
M0_INTERNAL void m0_cm_cp_only_fini(struct m0_cm_cp *cp)
Definition: cp.c:626
Definition: cm.h:205
static struct m0_reqh * reqh
Definition: cm.c:61
struct m0_be_domain * bs_domain
Definition: seg.h:82
M0_INTERNAL void m0_cm_lock(struct m0_cm *cm)
Definition: cm.c:545
uint32_t cnr_nlink
Definition: cob.h:426
Definition: dtm.h:554
Definition: cob.h:581
M0_INTERNAL int m0_bitmap_init(struct m0_bitmap *map, size_t nr)
Definition: bitmap.c:86
M0_INTERNAL void m0_fid_gob_make(struct m0_fid *gob_fid, uint32_t container, uint64_t key)
Definition: fid_convert.c:46
struct m0_reqh * m0_cs_reqh_get(struct m0_motr *cctx)
Definition: setup.c:1762
struct m0_rm_resource_type rc_rt
Definition: cm.h:200
#define NULL
Definition: misc.h:38
struct m0_bitmap cm_proxy_update_map
Definition: cm.h:252
struct m0_stob_id sc_stob_id
Definition: cp.h:45
struct m0_fid si_domain_fid
Definition: stob.h:103
M0_INTERNAL struct m0_sns_cm * cm2sns(struct m0_cm *cm)
Definition: cm.c:389
const struct m0_cm_ops * cm_ops
Definition: cm.h:188
Definition: sm.h:350
M0_INTERNAL struct m0_pool_version * m0_pool_version_find(struct m0_pools_common *pc, const struct m0_fid *id)
Definition: pool.c:586
static struct m0_sm_group * grp
Definition: bytecount.c:38
Definition: cp.h:160
static void iter_stop(uint64_t pool_width, uint64_t nr_files, uint64_t fd)
Definition: cm.c:446
struct m0_cob_domain * co_dom
Definition: cob.h:582
void(* cago_fini)(struct m0_cm_aggr_group *ag)
Definition: ag.h:140
M0_INTERNAL int m0_cm_stop(struct m0_cm *cm)
Definition: cm.c:866
M0_INTERNAL void m0_be_tx_fini(struct m0_be_tx *tx)
Definition: stubs.c:163
M0_INTERNAL void m0_dtx_init(struct m0_dtx *tx, struct m0_be_domain *be_domain, struct m0_sm_group *sm_group)
Definition: dtm.c:67
M0_INTERNAL void m0_ios_cdom_get(struct m0_reqh *reqh, struct m0_cob_domain **out)
Definition: io_service.c:463
static void cobs_delete(uint64_t nr_files, uint64_t nr_cobs)
Definition: cm.c:312
M0_INTERNAL void cob_delete(struct m0_cob_domain *cdom, struct m0_be_domain *bedom, uint64_t cont, const struct m0_fid *gfid)
Definition: cm.c:231
struct m0_layout * sf_layout
Definition: file.h:74
M0_INTERNAL void m0_cob_put(struct m0_cob *cob)
Definition: cob.c:1095
struct m0_fom p_fom
Definition: pump.h:51
static struct m0_sns_cm * scm
Definition: cm.c:64
M0_INTERNAL void m0_be_tx_prep(struct m0_be_tx *tx, const struct m0_be_tx_credit *credit)
Definition: stubs.c:175
struct m0_dtx fo_tx
Definition: fom.h:498
#define M0_BITS(...)
Definition: misc.h:236
static void _cpp_tx_close(struct m0_cm *cm)
Definition: cm.c:436
m0_cm_op
Definition: cm.h:37
M0_INTERNAL int m0_cob_fabrec_make(struct m0_cob_fabrec **rech, const char *link, size_t linklen)
Definition: cob.c:262
uint64_t cm_aggr_grps_out_nr
Definition: cm.h:233
#define container_of(ptr, type, member)
Definition: misc.h:33
#define M0_SET0(obj)
Definition: misc.h:64
Definition: ut.h:77
M0_INTERNAL void m0_cm_state_set(struct m0_cm *cm, enum m0_cm_state state)
Definition: cm.c:570
M0_INTERNAL void m0_cm_cp_only_init(struct m0_cm *cm, struct m0_cm_cp *cp)
Definition: cp.c:597
static struct m0_cob_domain * cdom
Definition: xform.c:55
M0_INTERNAL int m0_dtx_done_sync(struct m0_dtx *tx)
Definition: dtm.c:122
struct m0_fom * si_fom
Definition: iter.h:103
static struct m0_reqh_service * service
Definition: cm.c:62
uint32_t sag_fnr
Definition: ag.h:51
M0_INTERNAL struct m0_reqh_service_type * m0_reqh_service_type_find(const char *sname)
Definition: reqh_service.c:168
M0_INTERNAL int m0_cob_nskey_make(struct m0_cob_nskey **keyh, const struct m0_fid *pfid, const char *name, size_t namelen)
Definition: cob.c:148
static const struct m0_fid M0_SNS_CM_REPAIR_UT_PVER
Definition: cm.c:70
static void ag_destroy(void)
Definition: cm.c:284
static struct m0_cm * cm
Definition: cm.c:63
M0_INTERNAL void m0_cob_tx_credit(struct m0_cob_domain *dom, enum m0_cob_op optype, struct m0_be_tx_credit *accum)
Definition: cob.c:2281
op
Definition: libdemo.c:64
static int head(struct m0_sm *mach)
Definition: sm.c:468
M0_INTERNAL void m0_cm_unlock(struct m0_cm *cm)
Definition: cm.c:550
enum m0_cm_op sc_op
Definition: cm.h:209
static void service_init_failure(void)
Definition: cm.c:113
M0_INTERNAL void m0_sm_group_unlock(struct m0_sm_group *grp)
Definition: sm.c:96
M0_INTERNAL int m0_fom_timeout_wait_on(struct m0_fom_timeout *to, struct m0_fom *fom, m0_time_t deadline)
Definition: fom.c:1566
const struct m0_cm_cp_ops m0_sns_cm_repair_cp_ops
Definition: cp.c:421
static struct m0_sns_cm_ag * sag
Definition: cm.c:66
int i
Definition: dir.c:1033
static void cobs_create(uint64_t nr_files, uint64_t nr_cobs)
Definition: cm.c:292
struct m0_cm_cp sc_base
Definition: cp.h:39
#define M0_SET_ARR0(arr)
Definition: misc.h:72
M0_INTERNAL int m0_cob_delete_put(struct m0_cob *cob, struct m0_be_tx *tx)
Definition: cob.c:1853
struct m0_sns_cm_ag rag_base
Definition: ag.h:77
uint32_t rt_nr_resources
Definition: rm.h:415
#define M0_FID_TINIT(type, container, key)
Definition: fid.h:90
M0_INTERNAL void m0_fi_disable(const char *fp_func, const char *fp_tag)
Definition: finject.c:485
int(* cmo_prepare)(struct m0_cm *cm)
Definition: cm.h:294
static void m0_fi_enable(const char *func, const char *tag)
Definition: finject.h:276
static void _cpp_tx_start(struct m0_cm *cm)
Definition: cm.c:421
static struct m0_cob * cob
Definition: bytecount.c:40
static void iter_setup(enum m0_cm_op op, uint64_t fd)
Definition: cm.c:131
#define M0_ASSERT(cond)
const char * scf_name
Definition: sm.h:352
static void service_start_success(void)
Definition: cm.c:104
struct m0_fid pver
Definition: idx_dix.c:74
static void iter_repair_multi_file(void)
Definition: cm.c:475
M0_INTERNAL void m0_cob_nsrec_init(struct m0_cob_nsrec *nsrec)
Definition: cob.c:2058
static int iter_ut_fom_tick(struct m0_fom *fom, uint32_t *sem_id, int *phase)
Definition: cm.c:327
M0_INTERNAL void m0_cob_oikey_make(struct m0_cob_oikey *oikey, const struct m0_fid *fid, int linkno)
Definition: cob.c:141
Definition: tlist.h:251
Definition: cm.c:56
static void buf_put(struct m0_sns_cm_cp *scp)
Definition: cm.c:259
const struct m0_cm_cp_ops * c_ops
Definition: cp.h:169
M0_INTERNAL int m0_cob_create(struct m0_cob *cob, struct m0_cob_nskey *nskey, struct m0_cob_nsrec *nsrec, struct m0_cob_fabrec *fabrec, struct m0_cob_omgrec *omgrec, struct m0_be_tx *tx)
Definition: cob.c:1681
M0_INTERNAL int m0_be_tx_open_sync(struct m0_be_tx *tx)
Definition: stubs.c:199
static struct m0_fid cob_fid
Definition: net.c:116
struct m0_fid si_fid
Definition: stob.h:105
struct m0_be_tx_credit tx_betx_cred
Definition: dtm.h:560
M0_INTERNAL int m0_semaphore_init(struct m0_semaphore *semaphore, unsigned value)
Definition: semaphore.c:38
static struct m0_rpc_server_ctx sctx
Definition: console.c:88
Definition: cm.c:57
struct m0_sns_cm_cp fc_tgt_acc_cp
Definition: ag.h:45
M0_INTERNAL void m0_dtx_fini(struct m0_dtx *tx)
Definition: dtm.c:134
Definition: reqh.h:94
struct m0_sm_group * lo_grp
Definition: locality.h:67
Definition: dump.c:103
struct m0_cm_aggr_group * c_ag
Definition: cp.h:172
struct m0_ut_suite sns_cm_repair_ut
Definition: cm.c:536
static struct m0_sm_state_descr iter_ut_fom_phases[]
Definition: cm.c:72
static struct m0_semaphore iter_sem
Definition: cm.c:69
static void iter_repair_large_file_with_large_unit_size(void)
Definition: cm.c:482
struct m0_fom si_fom
Definition: fom_simple.h:120
M0_INTERNAL int m0_sns_cm_iter_next(struct m0_cm *cm, struct m0_cm_cp *cp)
Definition: iter.c:762
static void iter_ag_init_failure(void)
Definition: cm.c:521
M0_INTERNAL void m0_be_tx_init(struct m0_be_tx *tx, uint64_t tid, struct m0_be_domain *dom, struct m0_sm_group *sm_group, m0_be_tx_cb_t persistent, m0_be_tx_cb_t discarded, void(*filler)(struct m0_be_tx *tx, void *payload), void *datum)
Definition: stubs.c:150
Definition: fom.h:481
struct m0_reqh_service_type m0_rms_type
Definition: rm_service.c:69
const char * ts_name
Definition: ut.h:99
struct m0_tl cm_aggr_grps_out
Definition: cm.h:231
struct m0_sns_cm_file_ctx * sag_fctx
Definition: ag.h:48
M0_INTERNAL struct m0_reqh_service * m0_reqh_service_find(const struct m0_reqh_service_type *st, const struct m0_reqh *reqh)
Definition: reqh_service.c:538
uint64_t cm_proxy_nr
Definition: cm.h:250
M0_INTERNAL void m0_sns_cm_fctx_cleanup(struct m0_sns_cm *scm)
Definition: file.c:180
struct m0_sns_cm_repair_ag_failure_ctx * rag_fc
Definition: ag.h:93
Definition: setup.h:354
const char * sd_name
Definition: sm.h:383
struct m0_fid cnr_pver
Definition: cob.h:438
M0_INTERNAL void m0_fom_timeout_fini(struct m0_fom_timeout *to)
Definition: fom.c:1539
static void iter_run(uint64_t pool_width, uint64_t nr_files, uint64_t fd)
Definition: cm.c:386
M0_INTERNAL struct m0_locality * m0_locality0_get(void)
Definition: locality.c:169
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
struct m0_be_tx tx_betx
Definition: dtm.h:559
static struct m0_sns_cm_cp scp
Definition: cm.c:65
M0_INTERNAL void m0_semaphore_fini(struct m0_semaphore *semaphore)
Definition: semaphore.c:45
struct m0_motr motr
const struct m0_cm_aggr_group_ops * cag_ops
Definition: ag.h:74
m0_time_t m0_time_from_now(uint64_t secs, long ns)
Definition: time.c:96
int cs_init(struct m0_motr *sctx)
Definition: cp_common.c:206
struct m0_reqh_service cm_service
Definition: cm.h:191
struct m0_sns_cm_cp * si_cp
Definition: iter.h:109
Definition: cm.h:166
static struct m0_sm_conf iter_ut_conf
Definition: cm.c:98
static void service_start_failure(void)
Definition: cm.c:122
#define m0_tlist_endfor
Definition: tlist.h:448
struct m0_be_seg * rh_beseg
Definition: reqh.h:112
M0_INTERNAL void m0_sm_group_lock(struct m0_sm_group *grp)
Definition: sm.c:83
static bool cp_verify(struct m0_sns_cm_cp *scp)
Definition: cm.c:168
static void m0_fi_enable_once(const char *func, const char *tag)
Definition: finject.h:301
void(* co_free)(struct m0_cm_cp *cp)
Definition: cp.h:250
struct m0t1fs_filedata * fd
Definition: dir.c:1030
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
struct m0_tl c_buffers
Definition: cp.h:184
struct m0_sns_cm_rm_ctx sc_rm_ctx
Definition: cm.h:274
M0_INTERNAL int m0_dtx_open_sync(struct m0_dtx *tx)
Definition: dtm.c:101
struct m0_cm_cp_pump cm_cp_pump
Definition: cm.h:257
static struct m0_fom_simple iter_fom
Definition: cm.c:67
struct m0_pdclust_instance * sf_pi
Definition: file.h:77
static struct m0_sns_cm_repair_ag rag
Definition: net.c:54
struct m0_sns_cm_iter sc_it
Definition: cm.h:220
#define m0_tlist_for(descr, head, obj)
Definition: tlist.h:435
M0_INTERNAL int m0_cob_alloc(struct m0_cob_domain *dom, struct m0_cob **out)
Definition: cob.c:1100
M0_INTERNAL void m0_semaphore_down(struct m0_semaphore *semaphore)
Definition: semaphore.c:49
M0_INTERNAL void m0_fid_convert_gob2cob(const struct m0_fid *gob_fid, struct m0_fid *cob_fid, uint32_t device_id)
Definition: fid_convert.c:55
int(* cmo_start)(struct m0_cm *cm)
Definition: cm.h:301
M0_INTERNAL void m0_fom_timeout_init(struct m0_fom_timeout *to)
Definition: fom.c:1532
struct m0_fid gfid
Definition: dir.c:626
M0_INTERNAL void m0_semaphore_up(struct m0_semaphore *semaphore)
Definition: semaphore.c:65
struct m0_pools_common cc_pools_common
Definition: setup.h:356
static struct m0_fom_timeout iter_fom_timeout
Definition: cm.c:68
M0_INTERNAL bool m0_fid_is_valid(const struct m0_fid *fid)
Definition: fid.c:96
struct m0_tl cm_aggr_grps_in
Definition: cm.h:203
struct m0_reqh * rs_reqh
Definition: reqh_service.h:259
#define M0_FOM_SIMPLE_POST(s, r, c, t, f, d, l)
Definition: fom_simple.h:165
M0_INTERNAL struct m0_sns_cm_repair_ag * sag2repairag(const struct m0_sns_cm_ag *sag)
Definition: ag.c:61
M0_INTERNAL void cob_create(struct m0_reqh *reqh, struct m0_cob_domain *cdom, struct m0_be_domain *bedom, uint64_t cont, struct m0_fid *gfid, uint32_t cob_idx)
Definition: cm.c:176
M0_INTERNAL struct m0_motr * m0_cs_ctx_get(struct m0_reqh *reqh)
Definition: setup.c:1778
M0_INTERNAL struct m0_sns_cm_ag * ag2snsag(const struct m0_cm_aggr_group *ag)
Definition: ag.c:391
int32_t rc
Definition: trigger_fop.h:47
static void repair_ag_destroy(const struct m0_tl_descr *descr, struct m0_tl *head)
Definition: cm.c:264
#define ARRAY_SIZE(a)
Definition: misc.h:45
#define M0_UT_ASSERT(a)
Definition: ut.h:46
void pool_mach_transit(struct m0_reqh *reqh, struct m0_poolmach *pm, uint64_t fd, enum m0_pool_nd_state state)
Definition: cp_common.c:262
static void iter_repair_single_file(void)
Definition: cm.c:468
uint64_t cnr_lid
Definition: cob.h:437
M0_INTERNAL void m0_be_tx_close_sync(struct m0_be_tx *tx)
Definition: stubs.c:205
Definition: tx.h:280
struct m0_fid cnr_fid
Definition: cob.h:419