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 static enum m0_cm_op op;
72 
74  [M0_FOM_PHASE_INIT] = {
75  .sd_name = "init",
76  .sd_allowed = M0_BITS(ITER_RUN),
77  .sd_flags = M0_SDF_INITIAL
78  },
79  [ITER_RUN] = {
80  .sd_name = "Iterator run",
81  .sd_allowed = M0_BITS(ITER_WAIT, M0_FOM_PHASE_INIT,
83  },
84  [ITER_WAIT] = {
85  .sd_name = "Iterator wait",
86  .sd_allowed = M0_BITS(ITER_RUN, M0_FOM_PHASE_INIT,
88  },
89  [ITER_COMPLETE] = {
90  .sd_name = "Iterator complete",
92  },
94  .sd_name = "fini",
95  .sd_flags = M0_SDF_TERMINAL
96  }
97 };
98 
99 static struct m0_sm_conf iter_ut_conf = {
100  .scf_name = "iter ut fom",
101  .scf_nr_states = ARRAY_SIZE(iter_ut_fom_phases),
102  .scf_state = iter_ut_fom_phases,
103 };
104 
105 static void service_start_success(void)
106 {
107  int rc;
108 
109  rc = cs_init(&sctx);
110  M0_ASSERT(rc == 0);
111  cs_fini(&sctx);
112 }
113 
114 static void service_init_failure(void)
115 {
116  int rc;
117 
118  m0_fi_enable_once("m0_cm_init", "init_failure");
119  rc = cs_init(&sctx);
120  M0_ASSERT(rc != 0);
121 }
122 
123 static void service_start_failure(void)
124 {
125  int rc;
126 
127  m0_fi_enable_once("m0_cm_setup", "setup_failure");
128  rc = cs_init(&sctx);
129  M0_ASSERT(rc != 0);
130 }
131 
132 static void iter_setup(uint64_t fd)
133 {
134  struct m0_motr *motr;
135  struct m0_pool_version *pver;
136  int rc;
137 
138  rc = cs_init(&sctx);
139  M0_ASSERT(rc == 0);
140 
142  if (op == CM_OP_REPAIR) {
144  m0_reqh_service_type_find("M0_CST_SNS_REP"), reqh);
145  } else {
147  m0_reqh_service_type_find("M0_CST_SNS_REB"), reqh);
148  }
150 
151  cm = container_of(service, struct m0_cm, cm_service);
152  scm = cm2sns(cm);
153  scm->sc_op = op;
156  M0_UT_ASSERT(pver != NULL);
159  if (op == CM_OP_REBALANCE) {
162  }
163  rc = cm->cm_ops->cmo_prepare(cm);
164  M0_UT_ASSERT(rc == 0);
165  m0_cm_lock(cm);
168  rc = cm->cm_ops->cmo_start(cm);
169  M0_UT_ASSERT(rc == 0);
171  M0_UT_ASSERT(rc == 0);
173  m0_cm_unlock(cm);
175  M0_ASSERT(service != NULL);
176 }
177 
178 static bool cp_verify(struct m0_sns_cm_cp *scp)
179 {
180  return m0_fid_is_valid(&scp->sc_stob_id.si_fid) &&
182  scp->sc_base.c_ag != NULL &&
183  !cp_data_buf_tlist_is_empty(&scp->sc_base.c_buffers);
184 }
185 
186 M0_INTERNAL void cob_create(struct m0_reqh *reqh, struct m0_cob_domain *cdom,
187  struct m0_be_domain *bedom,
188  uint64_t cont, struct m0_fid *gfid,
189  uint32_t cob_idx)
190 {
191  struct m0_sm_group *grp = m0_locality0_get()->lo_grp;
192  struct m0_cob *cob;
193  struct m0_motr *motr;
194  struct m0_pool_version *pver;
195  struct m0_fid cob_fid;
196  struct m0_dtx tx = {};
197  struct m0_cob_nskey *nskey;
198  struct m0_cob_nsrec nsrec;
199  struct m0_cob_fabrec *fabrec;
200  struct m0_cob_omgrec omgrec;
201  char nskey_bs[UINT32_STR_LEN];
202  uint32_t nskey_bs_len;
203  int rc;
204 
205  M0_SET0(&nsrec);
206  M0_SET0(&omgrec);
207  rc = m0_cob_alloc(cdom, &cob);
208  M0_ASSERT(rc == 0 && cob != NULL);
210 
211  M0_SET_ARR0(nskey_bs);
212  snprintf(nskey_bs, UINT32_STR_LEN, "%u", cob_idx);
213  nskey_bs_len = strlen(nskey_bs);
214 
217  M0_UT_ASSERT(pver != NULL);
218  rc = m0_cob_nskey_make(&nskey, gfid, nskey_bs, nskey_bs_len);
219  M0_ASSERT(rc == 0 && nskey != NULL);
220  m0_cob_nsrec_init(&nsrec);
221  nsrec.cnr_fid = cob_fid;
222  nsrec.cnr_nlink = 1;
223  nsrec.cnr_pver = pver->pv_id;
224  nsrec.cnr_lid = 1;
225 
226  rc = m0_cob_fabrec_make(&fabrec, NULL, 0);
227  M0_ASSERT(rc == 0 && fabrec != NULL);
229  m0_dtx_init(&tx, bedom, grp);
231  rc = m0_dtx_open_sync(&tx);
232  M0_ASSERT(rc == 0);
233  rc = m0_cob_create(cob, nskey, &nsrec, fabrec, &omgrec, &tx.tx_betx);
234  M0_ASSERT(rc == 0);
235  m0_dtx_done_sync(&tx);
236  m0_dtx_fini(&tx);
238  m0_cob_put(cob);
239 }
240 
241 M0_INTERNAL void cob_delete(struct m0_cob_domain *cdom,
242  struct m0_be_domain *bedom,
243  uint64_t cont, const struct m0_fid *gfid)
244 {
245  struct m0_sm_group *grp = m0_locality0_get()->lo_grp;
246  struct m0_cob *cob;
247  struct m0_fid cob_fid;
248  struct m0_dtx tx = {};
249  struct m0_cob_oikey oikey;
250  int rc;
251 
253  m0_cob_oikey_make(&oikey, &cob_fid, 0);
254  rc = m0_cob_locate(cdom, &oikey, M0_CA_NSKEY_FREE, &cob);
255  M0_UT_ASSERT(rc == 0);
256 
258  m0_dtx_init(&tx, bedom, grp);
260  rc = m0_dtx_open_sync(&tx);
261  M0_ASSERT(rc == 0);
263  M0_UT_ASSERT(rc == 0);
264  m0_dtx_done_sync(&tx);
265  m0_dtx_fini(&tx);
267 }
268 
269 static void buf_put(struct m0_sns_cm_cp *scp)
270 {
272 }
273 
274 static void repair_ag_destroy(const struct m0_tl_descr *descr, struct m0_tl *head)
275 {
276  struct m0_sns_cm_repair_ag *rag;
277  struct m0_cm_aggr_group *ag;
278  struct m0_cm_cp *cp;
279  int i;
280 
281  m0_tlist_for(descr, head, ag) {
282  rag = sag2repairag(ag2snsag(ag));
283  for (i = 0; i < rag->rag_base.sag_fnr; ++i) {
284  cp = &rag->rag_fc[i].fc_tgt_acc_cp.sc_base;
285  if (rag->rag_fc[i].fc_is_inuse)
287  m0_cm_cp_only_fini(cp);
288  cp->c_ops->co_free(cp);
289  }
290  ag->cag_ops->cago_fini(ag);
291  } m0_tlist_endfor;
292 }
293 
294 static void rebalance_ag_destroy(const struct m0_tl_descr *descr, struct m0_tl *head)
295 {
296  struct m0_cm_aggr_group *ag;
297  bool can_fini_ag;
298 
299  m0_tlist_for(descr, head, ag) {
301  can_fini_ag = ag->cag_ops->cago_ag_can_fini(ag);
302  M0_UT_ASSERT(can_fini_ag);
303  ag->cag_ops->cago_fini(ag);
304  } m0_tlist_endfor;
305 }
306 
307 static void ag_destroy(void)
308 {
309  if (cm->cm_aggr_grps_in_nr == 0 && cm->cm_aggr_grps_out_nr == 0)
311 
312  if (op == CM_OP_REPAIR) {
313  repair_ag_destroy(&aggr_grps_in_tl, &cm->cm_aggr_grps_in);
314  repair_ag_destroy(&aggr_grps_out_tl, &cm->cm_aggr_grps_out);
315  } else {
316  rebalance_ag_destroy(&aggr_grps_in_tl, &cm->cm_aggr_grps_in);
317  rebalance_ag_destroy(&aggr_grps_out_tl, &cm->cm_aggr_grps_out);
318  }
319 }
320 
321 static void cobs_create(uint64_t nr_files, uint64_t nr_cobs)
322 {
323  struct m0_cob_domain *cdom;
324  struct m0_fid gfid;
325  uint32_t cob_idx;
326  int i;
327  int j;
328 
330  for (i = 0; i < nr_files; ++i) {
332  cob_idx = 0;
333  for (j = 1; j <= nr_cobs; ++j) {
335  j, &gfid, cob_idx);
336  cob_idx++;
337  }
338  }
339 }
340 
341 static void cobs_delete(uint64_t nr_files, uint64_t nr_cobs)
342 {
343  struct m0_cob_domain *cdom;
344  struct m0_fid gfid;
345  int i;
346  int j;
347 
349  for (i = 0; i < nr_files; ++i) {
351  for (j = 1; j <= nr_cobs; ++j)
353  }
354 }
355 
356 static int iter_ut_fom_tick(struct m0_fom *fom, uint32_t *sem_id, int *phase)
357 {
358  int rc = M0_FSO_AGAIN;
359 
360  switch (*phase) {
361  case M0_FOM_PHASE_INIT:
362  M0_SET0(&scp);
363  if (op == CM_OP_REPAIR)
365  else
368  scm->sc_it.si_cp = &scp;
369  *phase = ITER_RUN;
370  rc = M0_FSO_AGAIN;
371  break;
372  case ITER_RUN:
373  m0_cm_lock(cm);
375  if (rc == M0_FSO_AGAIN) {
378  M0_ASSERT(sag->sag_fctx != NULL);
381  buf_put(&scp);
383  *phase = M0_FOM_PHASE_INIT;
384  }
385  if (rc == M0_FSO_WAIT || rc == -ENOBUFS) {
386  *phase = ITER_WAIT;
387  rc = M0_FSO_WAIT;
388  }
389  if (rc < 0) {
390  ag_destroy();
391  *phase = ITER_COMPLETE;
392  rc = M0_FSO_AGAIN;
393  }
394  m0_cm_unlock(cm);
395  break;
396  case ITER_WAIT:
397  *phase = ITER_RUN;
398  rc = M0_FSO_AGAIN;
399  break;
400  case ITER_COMPLETE:
401  /* Allow asts to run if any. */
402  m0_cm_lock(cm);
403  m0_cm_unlock(cm);
404  if (scm->sc_rm_ctx.rc_rt.rt_nr_resources == 0) {
405  *phase = M0_FOM_PHASE_FINISH;
407  } else {
409  m0_time_from_now(2, 0));
410  }
411  rc = M0_FSO_WAIT;
412  break;
413  }
414 
415  return rc;
416 }
417 
418 static void iter_run(uint64_t pool_width, uint64_t nr_files, uint64_t fd)
419 {
420  struct m0_pool_version *pver;
421  struct m0_motr *motr;
422 
423  m0_fi_enable("m0_sns_cm_file_attr_and_layout", "ut_attr_layout");
424  m0_fi_enable("iter_fid_attr_fetch", "ut_attr_fetch");
425  m0_fi_enable("iter_fid_attr_fetch_wait", "ut_attr_fetch_wait");
426  m0_fi_enable("iter_fid_layout_fetch", "ut_layout_fsize_fetch");
427  m0_fi_enable("iter_fid_next", "ut_fid_next");
428 
429  cobs_create(nr_files, pool_width);
432  M0_SET0(&iter_fom);
435  M0_UT_ASSERT(pver != NULL);
436  //pool_mach_transit(&pver->pv_mach, fd, M0_PNDS_FAILED);
437  //pool_mach_transit(&pver->pv_mach, fd, M0_PNDS_SNS_REPAIRING);
440  &iter_ut_fom_tick, NULL, NULL, 2);
444  if (op == CM_OP_REPAIR)
446 
447  m0_fi_disable("m0_sns_cm_file_attr_and_layout", "ut_attr_layout");
448  m0_fi_disable("iter_fid_attr_fetch", "ut_attr_fetch");
449  m0_fi_disable("iter_fid_attr_fetch_wait", "ut_attr_fetch_wait");
450  m0_fi_disable("iter_fid_layout_fetch", "ut_layout_fsize_fetch");
451  m0_fi_disable("iter_fid_next", "ut_fid_next");
452 }
453 
454 static void _cpp_tx_start(struct m0_cm *cm)
455 {
456  int rc;
457  struct m0_be_tx_credit cred = {};
458  struct m0_be_tx *tx = &cm->cm_cp_pump.p_fom.fo_tx.tx_betx;
459  struct m0_sm_group *grp = m0_locality0_get()->lo_grp;
460 
463  NULL, NULL, NULL, NULL);
464  m0_be_tx_prep(tx, &cred);
465  rc = m0_be_tx_open_sync(tx);
466  M0_ASSERT(rc == 0);
467 }
468 
469 static void _cpp_tx_close(struct m0_cm *cm)
470 {
471  struct m0_sm_group *grp = m0_locality0_get()->lo_grp;
472  struct m0_be_tx *tx = &cm->cm_cp_pump.p_fom.fo_tx.tx_betx;
473 
475  m0_be_tx_fini(tx);
477 }
478 
479 static void iter_stop(uint64_t pool_width, uint64_t nr_files, uint64_t fd)
480 {
481  struct m0_pool_version *pver;
482  struct m0_motr *motr;
483 
484  _cpp_tx_start(cm);
485  m0_cm_stop(cm);
486  _cpp_tx_close(cm);
487 
488  cobs_delete(nr_files, pool_width);
491  M0_UT_ASSERT(pver != NULL);
492  /* Transition the failed device M0_PNDS_SNS_REBALANCING->M0_PNDS_ONLINE,
493  * for subsequent failure tests so that pool machine doesn't interpret
494  * it as a multiple failure after reading from the persistence store.
495  */
496  if (op == CM_OP_REPAIR)
499  cs_fini(&sctx);
500 }
501 
502 static void iter_repreb_single_file(void)
503 {
504  op = CM_OP_REPAIR;
505  iter_setup(2);
506  iter_run(6, 1, 2);
507  iter_stop(6, 1, 2);
509  iter_setup(2);
510  iter_run(6, 1, 2);
511  iter_stop(6, 1, 2);
512 }
513 
514 static void iter_repreb_multi_file(void)
515 {
516  op = CM_OP_REPAIR;
517  iter_setup(4);
518  iter_run(6, 2, 4);
519  iter_stop(6, 2, 4);
521  iter_setup(4);
522  iter_run(6, 2, 4);
523  iter_stop(6, 2, 4);
524 }
525 
527 {
528  op = CM_OP_REPAIR;
529  iter_setup(1);
530  iter_run(6, 1, 1);
531  iter_stop(6, 1, 1);
533  iter_setup(1);
534  iter_run(6, 1, 1);
535  iter_stop(6, 1, 1);
536 }
537 
538 /*
539 static void iter_rebalance_single_file(void)
540 {
541  int rc;
542 
543  iter_setup(SNS_REBALANCE, 2);
544  rc = iter_run(10, 1);
545  M0_UT_ASSERT(rc == -ENODATA);
546  iter_stop(1, 5);
547 }
548 
549 static void iter_rebalance_multi_file(void)
550 {
551  int rc;
552 
553  iter_setup(SNS_REBALANCE, 5);
554  rc = iter_run(10, 2);
555  M0_UT_ASSERT(rc == -ENODATA);
556  iter_stop(2, 10);
557 }
558 
559 static void iter_rebalance_large_file_with_large_unit_size(void)
560 {
561  int rc;
562 
563  iter_setup(SNS_REBALANCE, 9);
564  rc = iter_run(10, 1);
565  M0_UT_ASSERT(rc == -ENODATA);
566  iter_stop(1, 10);
567 }
568 */
569 
570 static void iter_ag_init_failure(void)
571 {
572  m0_fi_enable_once("m0_sns_cm_ag_init", "ag_init_failure");
573  op = CM_OP_REPAIR;
574  iter_setup(2);
575  iter_run(6, 1, 2);
576  iter_stop(6, 1, 2);
578  iter_setup(2);
579  iter_run(6, 1, 2);
580  iter_stop(6, 1, 2);
581 }
582 
583 static void iter_invalid_nr_cobs(void)
584 {
585  op = CM_OP_REPAIR;
586  iter_setup(3);
587  iter_run(3, 1, 3);
588  iter_stop(3, 1, 3);
590  iter_setup(3);
591  iter_run(3, 1, 3);
592  iter_stop(3, 1, 3);
593 }
594 
596  .ts_name = "sns-cm-repair-ut",
597  .ts_init = NULL,
598  .ts_fini = NULL,
599  .ts_tests = {
600  { "service-startstop", service_start_success},
601  { "service-init-fail", service_init_failure},
602  { "service-start-fail", service_start_failure},
603  { "iter-repreb-single-file", iter_repreb_single_file},
604  { "iter-repreb-multi-file", iter_repreb_multi_file},
605  { "iter-repreb-large-file-with-large-unit-size",
607  { "iter-ag-init-failure", iter_ag_init_failure},
608  { "iter-invalid-nr-cobs", iter_invalid_nr_cobs},
609  { NULL, NULL }
610  }
611 };
612 
613 /*
614  * Local variables:
615  * c-indentation-style: "K&R"
616  * c-basic-offset: 8
617  * tab-width: 8
618  * fill-column: 80
619  * scroll-step: 1
620  * End:
621  */
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:583
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:479
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:341
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:241
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:469
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
Definition: cm.c:56
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:307
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:114
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:321
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 iter_setup(uint64_t fd)
Definition: cm.c:132
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:454
static struct m0_cob * cob
Definition: bytecount.c:40
#define M0_ASSERT(cond)
const char * scf_name
Definition: sm.h:352
static void service_start_success(void)
Definition: cm.c:105
struct m0_fid pver
Definition: idx_dix.c:74
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:356
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
const struct m0_cm_cp_ops m0_sns_cm_rebalance_cp_ops
Definition: cp.c:446
static void buf_put(struct m0_sns_cm_cp *scp)
Definition: cm.c:269
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
static enum m0_cm_op op
Definition: cm.c:71
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
static void iter_repreb_large_file_with_large_unit_size(void)
Definition: cm.c:526
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
static void rebalance_ag_destroy(const struct m0_tl_descr *descr, struct m0_tl *head)
Definition: cm.c:294
static struct m0_sm_state_descr iter_ut_fom_phases[]
Definition: cm.c:73
static struct m0_semaphore iter_sem
Definition: cm.c:69
struct m0_ut_suite sns_cm_repreb_ut
Definition: cm.c:595
Definition: cm.c:57
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:570
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:418
M0_INTERNAL struct m0_locality * m0_locality0_get(void)
Definition: locality.c:169
#define M0_CNT_INC(cnt)
Definition: arith.h:226
uint64_t cag_freed_cp_nr
Definition: ag.h:98
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:99
static void service_start_failure(void)
Definition: cm.c:123
#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:178
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
static void iter_repreb_multi_file(void)
Definition: cm.c:514
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
bool(* cago_ag_can_fini)(const struct m0_cm_aggr_group *ag)
Definition: ag.h:137
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:260
#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:186
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:274
#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
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
static void iter_repreb_single_file(void)
Definition: cm.c:502