Motr  M0
ag.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 #define M0_TRACE_SUBSYSTEM M0_TRACE_SUBSYS_SNSCM
24 #include "lib/trace.h"
25 
26 #include "lib/memory.h"
27 #include "lib/errno.h"
28 #include "lib/misc.h"
29 #include "lib/finject.h"
30 
31 #include "fid/fid.h"
32 #include "ioservice/io_service.h" /* m0_ios_cdom_get */
33 #include "reqh/reqh.h"
34 #include "sns/parity_repair.h"
35 
36 #include "sns/cm/cm_utils.h"
37 #include "sns/cm/ag.h"
38 #include "sns/cm/cp.h"
39 #include "sns/cm/cm.h"
40 #include "sns/cm/iter.h"
41 #include "sns/cm/file.h"
42 #include "cm/proxy.h"
43 
57 };
58 
59 static struct m0_sm_state_descr ai_sd[AIS_NR] = {
60  [AIS_FID_LOCK] = {
62  .sd_name = "ag iter fid lock",
63  .sd_allowed = M0_BITS(AIS_FID_ATTR, AIS_FID_NEXT, AIS_FINI)
64  },
65  [AIS_FID_NEXT] = {
66  .sd_flags = 0,
67  .sd_name = "ag iter fid next",
68  .sd_allowed = M0_BITS(AIS_FID_LOCK, AIS_FINI)
69  },
70  [AIS_FID_ATTR] = {
71  .sd_flags = 0,
72  .sd_name = "ag iter fid attr",
73  .sd_allowed = M0_BITS(AIS_GROUP_NEXT, AIS_FID_LOCK,
75  },
76  [AIS_GROUP_NEXT] = {
77  .sd_flags = 0,
78  .sd_name = "ag iter group next",
79  .sd_allowed = M0_BITS(AIS_FID_NEXT, AIS_FID_LOCK, AIS_FINI)
80  },
81  [AIS_FINI] = {
82  .sd_flags = M0_SDF_TERMINAL,
83  .sd_name = "ag iter fini",
84  .sd_allowed = 0
85  }
86 };
87 
88 static const struct m0_sm_conf ai_sm_conf = {
89  .scf_name = "sm: ai_conf",
90  .scf_nr_states = ARRAY_SIZE(ai_sd),
91  .scf_state = ai_sd
92 };
93 
94 static enum ag_iter_state ai_state(struct m0_sns_cm_ag_iter *ai)
95 {
96  return ai->ai_sm.sm_state;
97 }
98 
99 static struct m0_sns_cm *ai2sns(struct m0_sns_cm_ag_iter *ai)
100 {
101  return container_of(ai, struct m0_sns_cm, sc_ag_it);
102 }
103 
104 static void ai_state_set(struct m0_sns_cm_ag_iter *ai, int state)
105 {
106  m0_sm_state_set(&ai->ai_sm, state);
107 }
108 
109 static bool _is_fid_valid(struct m0_sns_cm_ag_iter *ai, struct m0_fid *fid)
110 {
111  struct m0_fid fid_out = {0, 0};
112  struct m0_sns_cm *scm = ai2sns(ai);
113  struct m0_cob_domain *cdom = scm->sc_cob_dom;
114  struct m0_cob_nsrec *nsrec;
115  int rc;
116 
118  return false;
119  rc = m0_cob_ns_rec_of(&cdom->cd_namespace, fid, &fid_out, &nsrec);
120  if (rc == 0 && m0_fid_eq(fid, &fid_out))
121  return true;
122  return false;
123 }
124 
125 static int ai_group_next(struct m0_sns_cm_ag_iter *ai)
126 {
127  struct m0_cm_ag_id ag_id = {};
128  struct m0_sns_cm *scm = ai2sns(ai);
129  struct m0_cm *cm = &scm->sc_base;
130  struct m0_cm_aggr_group *ag;
131  struct m0_fom *fom;
132  struct m0_sns_cm_file_ctx *fctx = ai->ai_fctx;
133  struct m0_pool_version *pver;
134  uint64_t group_last = ai->ai_group_last;
135  uint64_t group = agid2group(&ai->ai_id_curr);
136  uint64_t i;
137  size_t nr_bufs;
138  int rc = 0;
139 
140  /* Move to next file if pool version is dirty already. */
141  pver = fctx->sf_pm->pm_pver;
143  goto fid_next;
144 
145  if (m0_cm_ag_id_is_set(&ai->ai_id_curr))
146  ++group;
148  for (i = group; i <= group_last; ++i) {
151  continue;
152  ag = m0_cm_aggr_group_locate(cm, &ag_id, true);
153  if (ag != NULL)
154  continue;
156  if (rc == -ENOSPC) {
158  rc = -ENOBUFS;
159  }
160  if (rc == 0) {
162  rc = m0_cm_aggr_group_alloc(cm, &ag_id, true, &ag);
163  if (rc != 0)
165  if (rc == 0)
166  ai->ai_id_next = ag_id;
167  }
168  if (rc < 0) {
169  if (M0_IN(rc, (-ENOMEM, -ENOBUFS)))
170  return M0_RC(rc);
171  else if (M0_IN(rc, (-ENOENT, -ESHUTDOWN))) {
172  rc = 0;
173  continue;
174  } else {
176  rc = 0;
177  goto fid_next;
178  }
179  }
180  }
181 
182 fid_next:
187 
188  return M0_RC(rc);
189 }
190 
191 static int ai_fid_attr(struct m0_sns_cm_ag_iter *ai)
192 {
193  struct m0_sns_cm_file_ctx *fctx = ai->ai_fctx;
194  struct m0_fom *fom;
195  int rc;
196 
197  fctx->sf_pm = ai->ai_pm;
199  if (rc == -EAGAIN) {
202  return M0_RC(M0_FSO_WAIT);
203  }
204  if (rc == 0) {
207  }
208  if (rc == -ENOENT) {
210  rc = 0;
211  }
212 
213  return M0_RC(rc);
214 }
215 
216 static int __file_lock(struct m0_sns_cm *scm, const struct m0_fid *fid,
217  struct m0_sns_cm_file_ctx **fctx)
218 {
219  struct m0_fom *fom;
220  int rc;
221 
224  if (rc == -EAGAIN) {
225  M0_ASSERT(*fctx != NULL);
227  }
228 
229  return M0_RC(rc);
230 }
231 
232 static int ai_pm_set(struct m0_sns_cm_ag_iter *ai, struct m0_fid *pv_id)
233 {
234  struct m0_sns_cm *scm = ai2sns(ai);
235  struct m0_reqh *reqh = m0_sns_cm2reqh(scm);
236  struct m0_pool_version *pv;
237  struct m0_fid *pver_id;
238  struct m0_cob_nsrec *nsrec;
239  struct m0_fid fid = {0, 0};
240  int rc = 0;
241 
242  pver_id = pv_id;
243  if (pver_id == NULL) {
245  &ai->ai_fid, &fid, &nsrec);
246  if (rc == 0)
247  pver_id = &nsrec->cnr_pver;
248  }
249  if (rc == 0) {
250  pv = m0_pool_version_find(reqh->rh_pools, pver_id);
251  ai->ai_pm = &pv->pv_mach;
252  }
253 
254  return M0_RC(rc);
255 }
256 
257 static int ai_fid_lock(struct m0_sns_cm_ag_iter *ai)
258 {
259  struct m0_sns_cm *scm = ai2sns(ai);
260  int rc = 0;
261 
262  if (!_is_fid_valid(ai, &ai->ai_fid)) {
264  return M0_RC(0);
265  }
266 
267  if (ai->ai_pm == NULL)
268  rc = ai_pm_set(ai, NULL);
269 
270  if (rc == 0) {
272  rc = __file_lock(scm, &ai->ai_fid, &ai->ai_fctx);
274  }
275 
276  if (rc == 0)
278 
279  return M0_RC(rc);
280 }
281 
282 static int ai_fid_next(struct m0_sns_cm_ag_iter *ai)
283 {
284  struct m0_fid fid = {0, 0};
285  struct m0_fid fid_curr = ai->ai_fid;
286  struct m0_sns_cm *scm = ai2sns(ai);
287  struct m0_cob_nsrec *nsrec;
288  int rc = 0;
289 
290  do {
291  M0_CNT_INC(fid_curr.f_key);
293  &fid_curr, &fid, &nsrec);
294  fid_curr = fid;
295  } while (rc == 0 &&
298 
299  if (rc == 0) {
300  M0_SET0(&ai->ai_id_curr);
301  ai->ai_fid = fid;
302  rc = ai_pm_set(ai, &nsrec->cnr_pver);
303  if (rc == 0)
305  }
306 
307  if (rc == -ENOENT)
308  rc = -ENODATA;
309 
310  return M0_RC(rc);
311 }
312 
313 static int (*ai_action[])(struct m0_sns_cm_ag_iter *ai) = {
318 };
319 
320 M0_INTERNAL int m0_sns_cm_ag__next(struct m0_sns_cm *scm,
321  const struct m0_cm_ag_id *id_curr,
322  struct m0_cm_ag_id *id_next)
323 {
324  struct m0_sns_cm_ag_iter *ai = &scm->sc_ag_it;
325  struct m0_cm *cm = &scm->sc_base;
326  struct m0_sns_cm_file_ctx *fctx;
327  struct m0_fid fid;
328  int rc;
329 
330  ai->ai_id_curr = *id_curr;
331  agid2fid(&ai->ai_id_curr, &fid);
332  fctx = ai->ai_fctx;
333  /*
334  * Reset ai->ai_id_curr if ag_next iterator has reached to higher fid
335  * through AIS_FID_NEXT than @id_curr in-order to start processing from
336  */
337  if (m0_fid_cmp(&ai->ai_fid, &fid) > 0)
338  M0_SET0(&ai->ai_id_curr);
339  if (m0_fid_cmp(&ai->ai_fid, &fid) < 0) {
340  if (fctx != NULL &&
345  }
346  ai->ai_fid = fid;
347  if (ai_state(ai) != AIS_FID_LOCK)
349  }
350 
351  do {
352  if ((cm->cm_quiesce || cm->cm_abort) && (M0_IN(ai_state(ai),
353  (AIS_FID_LOCK,
355  M0_LOG(M0_DEBUG, "%" PRId64 ": Got %s cmd", cm->cm_id,
356  cm->cm_quiesce ? "QUIESCE" : "ABORT");
357  return M0_RC(-ENODATA);
358  }
359  rc = ai_action[ai_state(ai)](ai);
360  } while (rc == 0);
361 
362  *id_next = ai->ai_id_next;
363  if (rc == -EAGAIN)
364  rc = M0_FSO_WAIT;
365 
366  return M0_RC(rc);
367 }
368 
369 M0_INTERNAL int m0_sns_cm_ag_iter_init(struct m0_sns_cm_ag_iter *ai)
370 {
371  struct m0_sns_cm *scm = ai2sns(ai);
372 
373  M0_SET0(ai);
376 
377  return M0_RC(0);
378 }
379 
380 M0_INTERNAL void m0_sns_cm_ag_iter_fini(struct m0_sns_cm_ag_iter *ai)
381 {
382  ai_state_set(ai, AIS_FINI);
383  m0_sm_fini(&ai->ai_sm);
384 }
385 
386 M0_INTERNAL struct m0_cm *snsag2cm(const struct m0_sns_cm_ag *sag)
387 {
388  return sag->sag_base.cag_cm;
389 }
390 
391 M0_INTERNAL struct m0_sns_cm_ag *ag2snsag(const struct m0_cm_aggr_group *ag)
392 {
393  return container_of(ag, struct m0_sns_cm_ag, sag_base);
394 }
395 
396 M0_INTERNAL void m0_sns_cm_ag_agid_setup(const struct m0_fid *gob_fid, uint64_t group,
397  struct m0_cm_ag_id *agid)
398 {
399  agid->ai_hi.u_hi = gob_fid->f_container;
400  agid->ai_hi.u_lo = gob_fid->f_key;
401  agid->ai_lo.u_hi = 0;
402  agid->ai_lo.u_lo = group;
403 }
404 
405 M0_INTERNAL void agid2fid(const struct m0_cm_ag_id *id, struct m0_fid *fid)
406 {
407  M0_PRE(id != NULL);
408  M0_PRE(fid != NULL);
409 
410  m0_fid_set(fid, id->ai_hi.u_hi, id->ai_hi.u_lo);
411 }
412 
413 M0_INTERNAL uint64_t agid2group(const struct m0_cm_ag_id *id)
414 {
415  M0_PRE(id != NULL);
416 
417  return id->ai_lo.u_lo;
418 }
419 
420 M0_INTERNAL uint64_t m0_sns_cm_ag_local_cp_nr(const struct m0_cm_aggr_group *ag)
421 {
422  struct m0_fid fid;
423  struct m0_cm *cm;
424  struct m0_sns_cm *scm;
425  struct m0_sns_cm_ag *sag = ag2snsag(ag);
426  struct m0_sns_cm_file_ctx *fctx = sag->sag_fctx;
427  uint64_t group;
428 
429  M0_ENTRY();
430  M0_PRE(ag != NULL);
431 
432  agid2fid(&ag->cag_id, &fid);
433  group = agid2group(&ag->cag_id);
434 
435  cm = ag->cag_cm;
436  M0_ASSERT(cm != NULL);
437  scm = cm2sns(cm);
438 
439  M0_LEAVE();
441 }
442 
443 M0_INTERNAL void m0_sns_cm_ag_fini(struct m0_sns_cm_ag *sag)
444 {
445  struct m0_cm_aggr_group *ag;
446  struct m0_cm *cm;
447  struct m0_sns_cm *scm;
448 
449  M0_ENTRY();
450  M0_PRE(sag != NULL);
451 
452  ag = &sag->sag_base;
453  cm = ag->cag_cm;
454  M0_ASSERT(cm != NULL);
455  scm = cm2sns(cm);
461  M0_LEAVE();
462 }
463 
464 M0_INTERNAL int m0_sns_cm_ag_init(struct m0_sns_cm_ag *sag,
465  struct m0_cm *cm,
466  const struct m0_cm_ag_id *id,
467  const struct m0_cm_aggr_group_ops *ag_ops,
468  bool has_incoming)
469 {
470  struct m0_sns_cm *scm = cm2sns(cm);
471  struct m0_fid gfid;
472  struct m0_sns_cm_file_ctx *fctx;
473  struct m0_pdclust_layout *pl;
474  uint64_t upg;
475  uint64_t f_nr;
476  int rc = 0;
477  struct m0_poolmach_state *pm_state;
478 
479  M0_ENTRY("scm: %p, ag id:%p", cm, id);
480  M0_PRE(sag != NULL && cm != NULL && id != NULL && ag_ops != NULL);
482 
483  agid2fid(id, &gfid);
484  fctx = m0_sns_cm_fctx_get(scm, id);
485  M0_ASSERT(fctx != NULL && fctx->sf_layout != NULL);
487  upg = m0_sns_cm_ag_size(pl);
488  m0_bitmap_init(&sag->sag_fmap, upg);
489  if (cm->cm_proxy_nr > 0)
491  cm->cm_proxy_nr);
492  if (rc != 0)
493  goto fail;
494 
495  sag->sag_fctx = fctx;
496  pm_state = fctx->sf_pm->pm_state;
497  /* calculate actual failed number of units in this group. */
498  f_nr = m0_sns_cm_ag_unrepaired_units(scm, fctx, id->ai_lo.u_lo, &sag->sag_fmap);
499  if (f_nr == 0 || f_nr > m0_pdclust_K(pl) ||
500  pm_state->pst_nr_failures > pm_state->pst_max_device_failures ||
501  M0_FI_ENABLED("ag_init_failure")) {
502  rc = M0_ERR_INFO(-EINVAL, "nr failures: %u group "M0_AG_F
503  " pst_nr_failures: %u pst_max_device_failures: %u",
504  (unsigned)f_nr, M0_AG_P(id), (unsigned)pm_state->pst_nr_failures,
505  (unsigned)pm_state->pst_max_device_failures);
506  goto fail;
507  }
508  sag->sag_fnr = f_nr;
509  if (has_incoming) {
514  if (rc != 0)
515  goto fail;
516  }
517  m0_cm_aggr_group_init(&sag->sag_base, cm, id, has_incoming, ag_ops);
519  M0_LEAVE("ag: %p", sag);
520  return M0_RC(rc);
521 fail:
523  m0_sns_cm_fctx_put(scm, id);
525  return M0_ERR(rc);
526 }
527 
529  struct m0_cm_proxy *proxy)
530 {
531  struct m0_sns_cm_ag *sag = ag2snsag(ag);
532  return sag->sag_proxy_in_count.p_count[proxy->px_id] > 0;
533 }
534 
535 static bool ag_id_is_in(const struct m0_cm_ag_id *id, const struct m0_cm_sw *interval)
536 {
537  return m0_cm_ag_id_cmp(id, &interval->sw_lo) >= 0 &&
538  m0_cm_ag_id_cmp(id, &interval->sw_hi) <= 0;
539 }
540 
541 M0_INTERNAL bool m0_sns_cm_ag_is_frozen_on(struct m0_cm_aggr_group *ag, struct m0_cm_proxy *pxy)
542 {
543  struct m0_cm *cm = ag->cag_cm;
544  struct m0_sns_cm_ag *sag = ag2snsag(ag);
545 
546  M0_ENTRY();
548 
549  /*
550  * Proxy can be NULL if cleanup is invoked for local node, this can happen
551  * in case of a single node setup.
552  * If proxy is not NULL then find out if there are any incoming copy packets
553  * from the given proxy that is already completed and the copy packets will
554  * no longer be arriving.
555  */
556  if (pxy != NULL && ag->cag_ops->cago_has_incoming_from(ag, pxy)) {
557  if ((M0_IN(pxy->px_status, (M0_PX_COMPLETE)) &&
558  !ag_id_is_in(&ag->cag_id, &pxy->px_out_interval)) ||
559  M0_IN(pxy->px_status, (M0_PX_STOP, M0_PX_FAILED)) ||
560  m0_cm_ag_id_cmp(&ag->cag_id, &pxy->px_out_interval.sw_lo) < 0) {
561  sag->sag_proxy_in_count.p_count[pxy->px_id] = 0;
563  }
564  }
565 
566  ag->cag_is_frozen = sag->sag_not_coming > 0;
567 
570  ag->cag_is_frozen = true;
571 
572  return ag->cag_is_frozen;
573 
574  M0_LEAVE();
575 }
576 
577 M0_INTERNAL bool m0_sns_cm_ag_has_data(struct m0_sns_cm_file_ctx *fctx, uint64_t group)
578 {
579  struct m0_pdclust_layout *pl;
580  uint32_t nr_max_du;
581 
582  nr_max_du = m0_sns_cm_file_data_units(fctx);
584  return !m0_sns_cm_file_unit_is_EOF(pl, nr_max_du, group, 0);
585 }
586 
588 #undef M0_TRACE_SUBSYSTEM
589 
590 /*
591  * Local variables:
592  * c-indentation-style: "K&R"
593  * c-basic-offset: 8
594  * tab-width: 8
595  * fill-column: 79
596  * scroll-step: 1
597  * End:
598  */
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 void m0_sns_cm_pver_dirty_set(struct m0_pool_version *pver)
Definition: cm_utils.c:580
struct m0_poolmach_state * pm_state
Definition: pool_machine.h:169
uint64_t id
Definition: cob.h:2380
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
static int ai_fid_lock(struct m0_sns_cm_ag_iter *ai)
Definition: ag.c:257
Definition: cm.h:205
uint32_t sag_not_coming
Definition: ag.h:81
static struct m0_fid gob_fid
Definition: net.c:115
int(* cmo_get_space_for)(struct m0_cm *cm, const struct m0_cm_ag_id *id, size_t *count)
Definition: cm.h:335
M0_INTERNAL uint64_t m0_sns_cm_ag_local_cp_nr(const struct m0_cm_aggr_group *ag)
Definition: ag.c:420
#define M0_PRE(cond)
M0_INTERNAL int m0_bitmap_init(struct m0_bitmap *map, size_t nr)
Definition: bitmap.c:86
M0_INTERNAL bool m0_sns_cm_pver_is_dirty(struct m0_pool_version *pver)
Definition: cm_utils.c:575
M0_INTERNAL void m0_mutex_unlock(struct m0_mutex *mutex)
Definition: mutex.c:66
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 void agid2fid(const struct m0_cm_ag_id *id, struct m0_fid *fid)
Definition: ag.c:405
Definition: sw.h:45
#define NULL
Definition: misc.h:38
#define M0_AG_P(ag)
Definition: ag.h:55
M0_INTERNAL void m0_bitmap_fini(struct m0_bitmap *map)
Definition: bitmap.c:97
static const struct m0_sm_conf ai_sm_conf
Definition: ag.c:88
static int __file_lock(struct m0_sns_cm *scm, const struct m0_fid *fid, struct m0_sns_cm_file_ctx **fctx)
Definition: ag.c:216
struct m0_bitmap sag_fmap
Definition: ag.h:84
M0_INTERNAL struct m0_sns_cm * cm2sns(struct m0_cm *cm)
Definition: cm.c:389
bool cm_quiesce
Definition: cm.h:277
const struct m0_cm_ops * cm_ops
Definition: cm.h:188
Definition: sm.h:350
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
static struct m0_sns_cm * ai2sns(struct m0_sns_cm_ag_iter *ai)
Definition: ag.c:99
struct m0_cm_ag_id sw_hi
Definition: sw.h:47
struct m0_pool_version * pv
Definition: dir.c:629
struct m0_poolmach pv_mach
Definition: pool.h:133
#define M0_LOG(level,...)
Definition: trace.h:167
M0_LEAVE()
uint64_t cm_id
Definition: cm.h:174
M0_INTERNAL uint64_t m0_sns_cm_file_data_units(struct m0_sns_cm_file_ctx *fctx)
Definition: file.c:768
M0_INTERNAL void m0_sns_cm_ag_agid_setup(const struct m0_fid *gob_fid, uint64_t group, struct m0_cm_ag_id *agid)
Definition: ag.c:396
static int(* ai_action[])(struct m0_sns_cm_ag_iter *ai)
Definition: ag.c:313
M0_INTERNAL bool m0_sns_cm_file_unit_is_EOF(struct m0_pdclust_layout *pl, uint64_t nr_max_data_units, uint64_t group, uint32_t unit)
Definition: file.c:786
static enum ag_iter_state ai_state(struct m0_sns_cm_ag_iter *ai)
Definition: ag.c:94
uint64_t sf_max_group
Definition: file.h:67
struct m0_layout * sf_layout
Definition: file.h:74
struct m0_cm_ag_id cag_id
Definition: ag.h:72
static struct m0_sns_cm * scm
Definition: cm.c:64
M0_INTERNAL void m0_sns_cm_ag_fini(struct m0_sns_cm_ag *sag)
Definition: ag.c:443
#define M0_BITS(...)
Definition: misc.h:236
M0_INTERNAL int m0_sns_cm_file_lock(struct m0_sns_cm *scm, const struct m0_fid *fid, struct m0_sns_cm_file_ctx **out)
Definition: file.c:404
struct m0_sns_cm_buf_pool sc_ibp
Definition: cm.h:227
#define container_of(ptr, type, member)
Definition: misc.h:33
#define M0_SET0(obj)
Definition: misc.h:64
M0_INTERNAL void m0_mutex_lock(struct m0_mutex *mutex)
Definition: mutex.c:49
struct m0_poolmach * sf_pm
Definition: file.h:70
static bool ag_id_is_in(const struct m0_cm_ag_id *id, const struct m0_cm_sw *interval)
Definition: ag.c:535
M0_INTERNAL int m0_fid_cmp(const struct m0_fid *fid0, const struct m0_fid *fid1)
Definition: fid.c:170
uint32_t * p_count
Definition: proxy.h:154
M0_INTERNAL void m0_sns_cm_file_attr_and_layout_wait(struct m0_sns_cm_file_ctx *fctx, struct m0_fom *fom)
Definition: file.c:744
M0_INTERNAL bool m0_cm_ag_id_is_set(const struct m0_cm_ag_id *id)
Definition: ag.c:95
static struct m0_cob_domain * cdom
Definition: xform.c:55
M0_INTERNAL void m0_cm_aggr_group_init(struct m0_cm_aggr_group *ag, struct m0_cm *cm, const struct m0_cm_ag_id *id, bool has_incoming, const struct m0_cm_aggr_group_ops *ag_ops)
Definition: ag.c:153
static struct m0_sm_state_descr ai_sd[AIS_NR]
Definition: ag.c:59
uint32_t sag_fnr
Definition: ag.h:51
uint64_t cag_cp_global_nr
Definition: ag.h:86
static int ai_group_next(struct m0_sns_cm_ag_iter *ai)
Definition: ag.c:125
struct m0_fid fid
Definition: di.c:46
return M0_RC(rc)
static struct m0_cm * cm
Definition: cm.c:63
M0_INTERNAL uint64_t agid2group(const struct m0_cm_ag_id *id)
Definition: ag.c:413
#define M0_ENTRY(...)
Definition: trace.h:170
bool cag_is_frozen
Definition: ag.h:106
M0_INTERNAL struct m0_sns_cm_file_ctx * m0_sns_cm_fctx_get(struct m0_sns_cm *scm, const struct m0_cm_ag_id *id)
Definition: file.c:457
#define M0_AG_F
Definition: ag.h:54
M0_INTERNAL void m0_sns_cm_ag_iter_fini(struct m0_sns_cm_ag_iter *ai)
Definition: ag.c:380
struct m0_fid ai_fid
Definition: ag.h:95
static struct m0_sns_cm_ag * sag
Definition: cm.c:66
int i
Definition: dir.c:1033
static struct m0_cm_ag_id ag_id
Definition: net.c:121
struct m0_sns_cm_file_ctx * ai_fctx
Definition: ag.h:103
M0_INTERNAL void m0_fid_set(struct m0_fid *fid, uint64_t container, uint64_t key)
Definition: fid.c:116
#define M0_ERR_INFO(rc, fmt,...)
Definition: trace.h:215
return M0_ERR(-EOPNOTSUPP)
struct m0_mutex sc_file_ctx_mutex
Definition: cm.h:271
M0_INTERNAL bool m0_sns_cm_ag_is_frozen_on(struct m0_cm_aggr_group *ag, struct m0_cm_proxy *pxy)
Definition: ag.c:541
struct m0_sns_cm * sf_scm
Definition: file.h:94
M0_INTERNAL const struct m0_fid M0_MDSERVICE_SLASH_FID
Definition: md_fid.c:63
ag_iter_state
Definition: ag.c:50
M0_INTERNAL bool m0_cm_ag_is_locked(struct m0_cm_aggr_group *ag)
Definition: ag.c:68
struct m0_cm_proxy_in_count sag_proxy_in_count
Definition: ag.h:57
M0_INTERNAL int m0_sns_cm_file_lock_wait(struct m0_sns_cm_file_ctx *fctx, struct m0_fom *fom)
Definition: file.c:370
enum m0_proxy_state px_status
Definition: proxy.h:91
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
M0_INTERNAL int m0_cm_ag_id_cmp(const struct m0_cm_ag_id *id0, const struct m0_cm_ag_id *id1)
Definition: ag.c:73
M0_INTERNAL void m0_sns_cm_file_unlock(struct m0_sns_cm *scm, struct m0_fid *fid)
Definition: file.c:504
#define M0_ASSERT(cond)
const char * scf_name
Definition: sm.h:352
struct m0_fid pver
Definition: idx_dix.c:74
M0_INTERNAL bool m0_sns_cm_ag_has_incoming_from(struct m0_cm_aggr_group *ag, struct m0_cm_proxy *proxy)
Definition: ag.c:528
void m0_sm_state_set(struct m0_sm *mach, int state)
Definition: sm.c:478
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
struct m0_cm * cag_cm
Definition: ag.h:70
M0_INTERNAL struct m0_cm_aggr_group * m0_cm_aggr_group_locate(struct m0_cm *cm, const struct m0_cm_ag_id *id, bool has_incoming)
Definition: ag.c:262
struct m0_sns_cm_ag_iter sc_ag_it
Definition: cm.h:222
struct m0_cm_ag_id sw_lo
Definition: sw.h:46
M0_INTERNAL struct m0_pdclust_layout * m0_layout_to_pdl(const struct m0_layout *l)
Definition: pdclust.c:382
uint64_t u_hi
Definition: types.h:36
M0_INTERNAL uint32_t m0_pdclust_K(const struct m0_pdclust_layout *pl)
Definition: pdclust.c:357
uint64_t f_container
Definition: fid.h:39
Definition: reqh.h:94
Definition: dump.c:103
static void group(void)
Definition: sm.c:386
uint32_t sag_incoming_cp_nr
Definition: ag.h:72
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
uint64_t px_id
Definition: proxy.h:63
struct m0_cob_domain * sc_cob_dom
Definition: cm.h:217
static bool _is_fid_valid(struct m0_sns_cm_ag_iter *ai, struct m0_fid *fid)
Definition: ag.c:109
#define PRId64
Definition: types.h:57
M0_INTERNAL void m0_cm_proxy_in_count_free(struct m0_cm_proxy_in_count *pcount)
Definition: proxy.c:771
M0_INTERNAL struct m0_reqh * m0_sns_cm2reqh(const struct m0_sns_cm *snscm)
Definition: cm_utils.c:547
struct m0_fom swu_fom
Definition: sw.h:83
M0_INTERNAL struct m0_cm * snsag2cm(const struct m0_sns_cm_ag *sag)
Definition: ag.c:386
struct m0_sm_group cm_sm_group
Definition: cm.h:185
M0_INTERNAL void m0_sns_cm_buf_wait(struct m0_sns_cm_buf_pool *sbp, struct m0_fom *fom)
Definition: cm.c:803
M0_INTERNAL bool m0_fid_eq(const struct m0_fid *fid0, const struct m0_fid *fid1)
Definition: fid.c:164
uint32_t sd_flags
Definition: sm.h:378
Definition: fom.h:481
struct m0_cm_sw px_out_interval
Definition: proxy.h:77
struct m0_sns_cm_file_ctx * sag_fctx
Definition: ag.h:48
static uint8_t fail[DATA_UNIT_COUNT_MAX+PARITY_UNIT_COUNT_MAX]
uint64_t cm_proxy_nr
Definition: cm.h:250
struct m0_sm ai_sm
Definition: ag.h:93
bool m0_cm_cp_pump_is_complete(const struct m0_cm_cp_pump *cp_pump)
Definition: pump.c:420
struct m0_reqh reqh
Definition: rm_foms.c:48
struct m0_fid cnr_pver
Definition: cob.h:438
bool(* cago_has_incoming_from)(struct m0_cm_aggr_group *ag, struct m0_cm_proxy *proxy)
Definition: ag.h:148
M0_INTERNAL int m0_sns_cm_ag_init(struct m0_sns_cm_ag *sag, struct m0_cm *cm, const struct m0_cm_ag_id *id, const struct m0_cm_aggr_group_ops *ag_ops, bool has_incoming)
Definition: ag.c:464
struct m0_cm_sw_update cm_sw_update
Definition: cm.h:259
#define M0_CNT_INC(cnt)
Definition: arith.h:226
static void ai_state_set(struct m0_sns_cm_ag_iter *ai, int state)
Definition: ag.c:104
#define M0_FI_ENABLED(tag)
Definition: finject.h:231
Definition: fid.h:38
uint64_t f_key
Definition: fid.h:40
static int ai_fid_next(struct m0_sns_cm_ag_iter *ai)
Definition: ag.c:282
M0_INTERNAL int m0_cob_ns_rec_of(struct m0_be_btree *cob_namespace, const struct m0_fid *key_gfid, struct m0_fid *next_gfid, struct m0_cob_nsrec **nsrec)
Definition: ns_iter.c:56
M0_INTERNAL void m0_sm_init(struct m0_sm *mach, const struct m0_sm_conf *conf, uint32_t state, struct m0_sm_group *grp)
Definition: sm.c:313
M0_INTERNAL uint64_t m0_sns_cm_ag_size(const struct m0_pdclust_layout *pl)
Definition: cm_utils.c:239
uint32_t pst_nr_failures
Definition: pool_machine.h:131
const struct m0_cm_aggr_group_ops * cag_ops
Definition: ag.h:74
Definition: ag.c:55
M0_INTERNAL int m0_sns_cm_ag__next(struct m0_sns_cm *scm, const struct m0_cm_ag_id *id_curr, struct m0_cm_ag_id *id_next)
Definition: ag.c:320
M0_INTERNAL int m0_cm_proxy_in_count_alloc(struct m0_cm_proxy_in_count *pcount, uint32_t nr_proxies)
Definition: proxy.c:758
Definition: ag.c:56
Definition: cm.h:166
M0_INTERNAL int m0_sns_cm_file_attr_and_layout(struct m0_sns_cm_file_ctx *fctx)
Definition: file.c:694
uint64_t ai_group_last
Definition: ag.h:101
struct m0_pools_common * rh_pools
Definition: reqh.h:118
uint32_t pst_max_device_failures
Definition: pool_machine.h:126
M0_INTERNAL bool m0_sns_cm_ag_has_data(struct m0_sns_cm_file_ctx *fctx, uint64_t group)
Definition: ag.c:577
uint64_t cag_cp_local_nr
Definition: ag.h:92
uint32_t sag_incoming_units_nr
Definition: ag.h:66
M0_INTERNAL void m0_sns_cm_cancel_reservation(struct m0_sns_cm *scm, size_t nr_bufs)
Definition: cm.c:926
struct m0_uint128 ai_hi
Definition: ag.h:50
struct m0_uint128 ai_lo
Definition: ag.h:51
M0_INTERNAL int m0_sns_cm_fctx_state_get(struct m0_sns_cm_file_ctx *fctx)
Definition: file.c:137
M0_INTERNAL void m0_sns_cm_print_status(struct m0_sns_cm *scm)
Definition: cm.c:742
uint32_t sag_cp_created_nr
Definition: ag.h:60
struct m0_cm_cp_pump cm_cp_pump
Definition: cm.h:257
struct m0_cm sc_base
Definition: cm.h:206
struct m0_poolmach * ai_pm
Definition: ag.h:105
static struct m0_sns_cm_file_ctx fctx
Definition: net.c:55
M0_INTERNAL int m0_cm_aggr_group_alloc(struct m0_cm *cm, const struct m0_cm_ag_id *id, bool has_incoming, struct m0_cm_aggr_group **out)
Definition: ag.c:330
static int ai_fid_attr(struct m0_sns_cm_ag_iter *ai)
Definition: ag.c:191
struct m0_cm_ag_id ai_id_next
Definition: ag.h:99
struct m0_cm_aggr_group sag_base
Definition: ag.h:46
struct m0_fid gfid
Definition: dir.c:626
static int ai_pm_set(struct m0_sns_cm_ag_iter *ai, struct m0_fid *pv_id)
Definition: ag.c:232
uint64_t u_lo
Definition: types.h:37
M0_INTERNAL bool m0_cm_is_locked(const struct m0_cm *cm)
Definition: cm.c:560
uint32_t sm_state
Definition: sm.h:307
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
bool cm_abort
Definition: cm.h:282
#define ARRAY_SIZE(a)
Definition: misc.h:45
M0_INTERNAL void m0_sns_cm_fctx_put(struct m0_sns_cm *scm, const struct m0_cm_ag_id *id)
Definition: file.c:481
Definition: ag.h:49
M0_INTERNAL void m0_cm_aggr_group_fini_and_progress(struct m0_cm_aggr_group *ag)
Definition: ag.c:207
M0_INTERNAL const struct m0_fid M0_COB_ROOT_FID
Definition: md_fid.c:39
struct m0_cm_ag_id ai_id_curr
Definition: ag.h:97
M0_INTERNAL int m0_sns_cm_ag_iter_init(struct m0_sns_cm_ag_iter *ai)
Definition: ag.c:369
struct m0_be_btree cd_namespace
Definition: cob.h:271
M0_INTERNAL void m0_sns_cm_reserve_space(struct m0_sns_cm *scm, size_t nr_bufs)
Definition: cm.c:916
M0_INTERNAL void m0_sm_fini(struct m0_sm *mach)
Definition: sm.c:331
static uint nr_bufs